web-dev-qa-db-fra.com

XHTML Strict 1.0 - target = "_ blank" non valide?

Je viens de valider ma doc actuelle XHTML Strict 1.0 avec le service de validation w3c .. et ça dit ça,

<ul id="socialnetwork">
            <li><a href="http://www.Twitter.com" target="_blank"></a></li>
            <li><a href="http://www.flickr.com" target="_blank"></a></li>
            <li><a href="http://www.xing.com" target="_blank"></a></li>
            <li><a href="http://www.rss.com" target="_blank"></a></li>
</ul>

la cible = "_ vierge" n'est pas valide .. mais j'ai besoin de la cible vide pour qu'un nouvel onglet s'ouvre dans le navigateur, de sorte que l'utilisateur ne quitte pas la page principale.

Que puis-je faire? Pourquoi n'est-ce pas valable?

23
Tomkay

Vous voudrez peut-être consulter la foire aux questions sur W3: http://www.w3.org/MarkUp/2004/xhtml-faq#target

Pourquoi l'attribut cible a-t-il été supprimé de XHTML 1.1?

Ça ne l'était pas. XHTML 1.0 est disponible en trois versions: strict, transitionnel et frameset. Ces trois éléments ont été délibérément maintenus aussi proches que possible de HTML 4.01 que le permettait XML. XHTML 1.1 est une version mise à jour de XHTML 1.0 strict et aucune version de HTML strict n’a jamais inclus l’attribut cible. Les deux autres versions, transitionnelle et frameset, n'ont pas été mises à jour car il n'y avait rien à mettre à jour. Si vous souhaitez utiliser l'attribut cible, utilisez XHTML 1.0 transitionnel.

16
user282931

La question que vous devriez vous poser n’est pas de savoir comment "contourner" la restriction de Strict mais pourquoi vous souhaitez utiliser XHTML Strict 1.0 en premier lieu? 

Dans votre cas, j'utiliserais simplement Transitional comme DTD. À moins bien sûr que vous ne développiez pour un système d'exploitation spécifique qui, par exemple, ne permet pas l'ouverture de plusieurs fenêtres, par exemple dans des systèmes de voiture, un téléphone mobile ou des appareils plus exotiques. C'est d'ailleurs la raison pour laquelle la cible est absente du code HTML strict. 

Mais comme vous semblez vous développer pour une utilisation "normale", votre type de document doit en tenir compte et vous devriez utiliser:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">

Voir aussi pourquoi la cible a-t-elle été retirée de xhtml Cheers J

9
theking2

Je suggère not en ajoutant l'attribut target. Il a été abandonné pour des raisons d'accessibilité, et je ne l'aime pas quand la page décide de moi comment les balises de mon navigateur s'ouvrent. Bien sûr, vous êtes libre de le faire, si vous le souhaitez. Je vais vous montrer une méthode JavaScript, mentionnée ci-dessus par Darin, qui vous permet de valider en tant que XHTML 1.0 Strict ou XHTML 1.1:

Code HTML:

<!-- Added link titles for better testing purposes -->
<ul id="socialnetwork">
    <li><a href="http://www.Twitter.com/" class="targetblank">Twitter</a></li>
    <li><a href="http://www.flickr.com/" class="targetblank">Flickr</a></li>
    <li><a href="http://www.xing.com/" class="targetblank">XING</a></li>
    <li><a href="http://www.rss.com/" class="targetblank">RSS</a></li>
</ul>

Code JavaScript:

window.onload = function() {
    // Code if document.getElementByClassName() doesn't exist
    if (document.getElementsByClassName == undefined) {
        document.getElementsByClassName = function(className) {
            var hasClassName = new RegExp("(?:^|\\s)" + className + "(?:$|\\s)");
            var allElements = document.getElementsByTagName("*");
            var results = [];

            var element;
            for (var i = 0; (element = allElements[i]) != null; i++) {
                var elementClass = element.className;
                if (elementClass && elementClass.indexOf(className) != -1 && hasClassName.test(elementClass))
                    results.Push(element);
            }

            return results;
        }
    }

    var anchorList = document.getElementsByClassName('targetblank');
    for (var i in anchorList) {
        anchorList[i].target = '_blank';
    }
}

Bien sûr, vous pouvez omettre le fichier window.onload si vous l'incluez déjà ailleurs, mais je vous recommande de l'utiliser (ou d'utiliser une autre fonction de chargement, telle que $(document).ready(); de JQuery) afin que JavaScript soit chargé à la fin du chargement de la page. Maintenant, tout ce que vous avez à faire est de donner à chaque lien d'ancrage une classe de "targetblank", et les liens doivent s'ouvrir dans un nouvel onglet.

7
mc10

Pour cette situation, j'utilise une simple solution jQuery qui la valide avec XHTML Strict et permet à de nouvelles fenêtres d'apparaître.

<a href="http://www.example.com" class="linkExternal">Example URL</a>

<script type="text/javascript">
$(function(){
    $('a.linkExternal').on('click',function(e){
        e.preventDefault();
        window.open($(this).attr('href'));
    });
});
3
Kristian Williams

Bien que je ne puisse pas dire pourquoi cet attribut est considéré comme non valide comme solution de contournement, vous pouvez l'ajouter avec javascript si vous souhaitez que votre site soit validé en tant que XHTML Strict.

1
Darin Dimitrov

Essaye ça:

<a href="#" onclick="window.open('urlgoeshere');">Link</a>
0
prplxr

La meilleure façon d'utiliser la cible dans XHTML STRICT est la suivante: onclick="target='_blank';"

<a href="http://botje.tnhteam.com/" onclick="target='_blank';">Botje is overal</a>

Exemple: cliquez sur le bouton STRICT en bas

si vous avez besoin de _self ou de toute autre cible, vous pouvez remplacer _blank par _self, par exemple: onclick="target='_self';"

J'espère que cette réponse sera utile à certains d'entre vous ...

0
jagb