11521 sujets

JavaScript, DOM et API Web HTML5

Bonjour à tous

Dans cet exemple:

<div class="xxx">
    <script>mon_script()</script>
</div>
....
<div class="yyy">
    <script>mon_script()</script>
</div>

le script 'mon_script' peut il récupérer la classe de la balise <div> dans laquelle il est appelé en jouant sur le DOM (ou toute autre méthode), plutôt que devoir passer un argument supplémentaire au script?
Je n'ai rien trouvé sur ce sujet dans les forums que j'ai consultés.
Je pense que ce n'est pas possible, mais peut être y a-t-il une solution que je ne vois pas???

Merci de vos conseils
Modérateur
Bonjour,

il y a une proposition du WHATWG à ce propos, document.currentScript mais son implémentation reste largement anecdotique.

Mais il y a de bonnes manières de contourner ce manque, ça dépend de ce que tu veux faire.
Modérateur
Par exemple, si on n'a pas accès à l'élément parent (je suppose que c'est la raison de cette demande):
<div class="xxx">
    <span data-marker="here"></span>
</div>
....
<div class="yyy">
    <span data-marker="here"></span>
</div>
<script >
var matches = document.querySelectorAll('span[data-marker="here"]');
for (i = 0; i < matches.length; ++i) {
  var className = matches[i].parentNode.className;
  alert(className);
}
</script>
[/i]
Modifié par kustolovic (04 Oct 2016 - 13:40)
Merci de ta réponse, mais je ne comprends pas comment leutilier.
Je peux très bien dans mon script faire une recherche
var scripts = document.getElementsByTagName('script');

Je peux ensuite pour chaque script rechercher le parentNode et en tirer ce que je veux.
Le point qui pose problème, c'est de savoir lequel de ces éléments est le script courant.

Quoique...
Cela me donne une idée: si j'analyse la commande du script, je dois pouvoir trouver laquelle est la courante, pour autant bien entendu qu'il n'y ait pas plusieurs appels de scripts avec les même arguments.
Je vais regarder cela de près.
Effectivement, ça fonctionne.
Il s'agit d'un script
diapo('image',autres arguments);

et je veux savoir s'il est appelé depuis l'intérieur d'une balise <figure class="cluster">
Le code:

function inCluster(name, variable)  {
    var scripts = document.getElementsByTagName('script');
    var searchReg = new RegExp(name + '\\s*\\(.*' + variable);
    for(var i = 0; i < scripts.length; i++) {
        var script = scripts[ i ];
        var scriptText = script.innerHTML;
        if(scriptText.match(searchReg)) {
            var curParent = script.parentNode;
                while(curParent) {
                    if(curParent.className.match(/cluster/)) return true;
                        curParent = curParent.parentNode;
                    }
                return false;
                }
        }
}
.....
function diapo(image, arg2, arg3) {
    if(inCluster('diapo', 'image')  {........}
}

Bien sûr cela ne fonctionne que parce que je sais que dans ce contexte le script diapo n'est jamais appelé deux fois avec le même nom d'image.
Modifié par PapyJP (04 Oct 2016 - 16:30)