За последние 24 часа нас посетили 17485 программистов и 1720 роботов. Сейчас ищут 1528 программистов ...

Есть задача. Получить tag текущего скрипта.

Тема в разделе "JavaScript и AJAX", создана пользователем mpak, 18 ноя 2014.

  1. mpak

    mpak Активный пользователь

    С нами с:
    30 окт 2006
    Сообщения:
    440
    Симпатии:
    0
    В такой конструкции

    <script>
    // Код
    </script>

    Нужно найти ссылку на текущий тег <script> знаю что проще всего поставить id по которому уже можно выбрать. Но условие - сделать это без id так как нет желания у всех скриптов ставить этот параметр а особенно следить за его уникальностью. Каждый раз выставляя задумываться "точно ли нет таких id в коде?"

    Нашел такие решения

    Нашел здесь: https://developer.mozilla.org/en-US/docs/Web/API/document.currentScript
    var curScriptElement = document.currentScript; // Не работает в chromium

    И здесь: http://www.2ality.com/2014/05/current-script.html
    document.scripts[document.scripts.length-1] // Выдает всегда последний
    В случае если скрипт не последний последняя строка не работает.

    Подскажите пожалуйста как мне найти текущий скрипт?
     
  2. metadon

    metadon Активный пользователь

    С нами с:
    6 фев 2006
    Сообщения:
    779
    Симпатии:
    0
    Можно отталкиваться от этого

    Код (PHP):
    1. <!DOCTYPE html>
    2. <html>
    3. <body>
    4.  
    5. <script>
    6. function myFunction() {
    7. var js = document.getElementsByTagName("script"); 
    8.   for (var i = 0; i < js.length; i++) { 
    9.     alert(js[i].innerHTML);
    10.   }
    11. }
    12. </script>
    13.  
    14. <script>
    15. function myFunction2() {
    16. alert('hello js');
    17. }
    18. </script>
    19.  
    20. <button onclick="myFunction()">Try it</button>
    21.  
    22. </body>
    23. </html>
     
  3. mpak

    mpak Активный пользователь

    С нами с:
    30 окт 2006
    Сообщения:
    440
    Симпатии:
    0
    Этот способ я знаю. Но он меня не устраивает тем, что требует наличия уникальных id или классов. Хотелось бы просто скопировать код в другую верстку и чтобы он сразу же стал работать без расстановки идентификаторов и проверки на наличие оных в новой верстке. Я написал выше что ищу решение без них.
     
  4. metadon

    metadon Активный пользователь

    С нами с:
    6 фев 2006
    Сообщения:
    779
    Симпатии:
    0
    Я правил своё сообщение
     
  5. mpak

    mpak Активный пользователь

    С нами с:
    30 окт 2006
    Сообщения:
    440
    Симпатии:
    0
    Не увидел решение. Где в нем ссылка на текущий script и его получение?

    Что то наподобии такого хотел бы получить

    var curScript = document.scripts[document.scripts.length-1]

    но это строка указывает на последний скрипт в коде. А мне нужно, чтобы на текущий.
     
  6. metadon

    metadon Активный пользователь

    С нами с:
    6 фев 2006
    Сообщения:
    779
    Симпатии:
    0
    нужно получить значение src?
     
  7. mpak

    mpak Активный пользователь

    С нами с:
    30 окт 2006
    Сообщения:
    440
    Симпатии:
    0
    нет же. Нужно такое

    <script>
    var curScript = document.scripts[document.scripts.length-1];
    </script>

    только на текущий скрипт.
     
  8. metadon

    metadon Активный пользователь

    С нами с:
    6 фев 2006
    Сообщения:
    779
    Симпатии:
    0
    Что значит текущий скрипт? Если есть два скрипта, как определить какой текущий?
     
  9. mpak

    mpak Активный пользователь

    С нами с:
    30 окт 2006
    Сообщения:
    440
    Симпатии:
    0
    В этом и вопрос. Как из скрипта получить ссылку на tag script текущего скрипта?
    Задача нужна, чтобы привязаться к dom обьектам где физически расположен скрипт, получить dom родителя в котором лежит текст скрипта.
     
  10. metadon

    metadon Активный пользователь

    С нами с:
    6 фев 2006
    Сообщения:
    779
    Симпатии:
    0
    исходный код текущего скрипта, мы его можем пометить?
     
  11. mpak

    mpak Активный пользователь

    С нами с:
    30 окт 2006
    Сообщения:
    440
    Симпатии:
    0
    Можем, но меня этот способ не устраивает. Хочется именно без дополнительных телодвижений, так как планирую двигать скрипт по дом обьекту. И он длжен работать всегда с элементом в котором расположен. Плюс нужно проверять, чтобы небыло уже элементов с таким id или class это тоже усложняет подобное решение и вносит ошибки в случае если такие дубликаты будут. Интересен вариант без отметок

    есть же внутри функций метки на саму себя arguments.callee() что то подобное для скриптов есть интересно?
     
  12. metadon

    metadon Активный пользователь

    С нами с:
    6 фев 2006
    Сообщения:
    779
    Симпатии:
    0
    так можно для тега script выделить id из 32 символов и оно будет уникальное
     
  13. mpak

    mpak Активный пользователь

    С нами с:
    30 окт 2006
    Сообщения:
    440
    Симпатии:
    0
    Сейчас я так и делаю. Но хотел бы уйти от этого способа. Так как если найти то, что я ищу можно будет скрипт вставлять в код динамически или в не свою верстку, не придумывая id. Ну или как вариант даже если поставить. Я хочу их поставить скриптом. Как мне до этого элемента добраться. В этом проблема.

    Как скриптом поставить самому себе id? Замкнутый круг какой то... Я не могу до него добраться так как не знаю его id и поставить его я тоже не могу, так как не могу до него добраться.
     
  14. metadon

    metadon Активный пользователь

    С нами с:
    6 фев 2006
    Сообщения:
    779
    Симпатии:
    0
    Ну тогда можно назвать в скрипте одну переменную опять же уникально, например var gdfTdsjd433sjd
    потом получить все script и через регулярные выражения найти в исходнике var gdfTdsjd433sjd и присвоить этому тегу id или так делать каждый раз
     
  15. mpak

    mpak Активный пользователь

    С нами с:
    30 окт 2006
    Сообщения:
    440
    Симпатии:
    0
    Скопировать данный скрипт не получится без изменения кода. Так как придется менять значение этой переменной. ОТ чего хотел уйти к тому снова возвращаюсь. Что то не верю что способа нет. Должен быть. Меня аж проберает когда понимаю что получается что с кода вообще никак нельзя привязаться к dom обьекту где этот код написан. Ужос какой то.

    Как мне кажется должны быть какие то методанные по всем скриптам. Их код, номер по порядку еще что нибудь. Как то по ним думаю можно.

    Добавлено спустя 12 минут 8 секунд:
    Вот похоже что то нарыл https://rawgit.com/JamesMGreene/fb4a71e060da6e26511d/raw/76 ... tScript.js
     
  16. mpak

    mpak Активный пользователь

    С нами с:
    30 окт 2006
    Сообщения:
    440
    Симпатии:
    0
  17. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    неплохо

    если нет отрицания, например "не плохо, а ужасно", то пишется вместе, если нет третьего слова, например "не очень плохо".
     
  18. torrius

    torrius Активный пользователь

    С нами с:
    28 июн 2014
    Сообщения:
    35
    Симпатии:
    1
    Код (Text):
    1.  
    2. <script type="text/javascript">
    3.         function getThisScript(){
    4.             var tags = document.getElementsByTagName('script');
    5.             return tags[tags.length-1];
    6.         }
    7. </script>
    8.  
    9. <script type="text/javascript" data-name='lalala'>
    10.     alert(getThisScript().getAttribute('data-name'));
    11. </script>
    12.  
    13. <script type="text/javascript"></script>
    14.  
    15. <script type="text/javascript" id="blabla">
    16.     alert(getThisScript().id); /* функция getThisScript() возвращает текущий script (в котором вызвана)*/
    17. </script>
    Вот только где это может быть надо на практике? ;)
     
  19. mpak

    mpak Активный пользователь

    С нами с:
    30 окт 2006
    Сообщения:
    440
    Симпатии:
    0
    Я уже запускал такую реализацию. Судя по всему вы недостаточно протестировали свой код. Первый alert выводит "undefined" а последний "blabla". Это происходит потому, что в строка return tags[tags.length-1]; всегда вернет последний скрипт из созданных на странице. То есть чтобы использовать ваш код нужно быть уверенным, что за скриптом больше не будет вставок других скриптов. В реальной жизни я не могу быть в этом уверенным. К сожалению приходится работать с множественными вставками данной конструкции. И нужно найти реализацию, которая выберет именно текущий тег скрипта.

    Выше я уже указывал для чего планирую использовать данную конструкцию. Она будет навешивать события на тег в котором расположен скрипт. Вот здесь описана такой же подход как и мой. Но насколько я понимаю решение у них так и не было найдено. http://xpoint.ru/forums/programming/javascript/misc/thread/36850.xhtml

    Вот этот вариант где то очень близко к решение, но у меня на хромиумен это не заработало. Подозреваю что если у меня не заработало, значит и на большей части остальных браузеров тоже не будет работать.

    Код (Text):
    1. <script type="text/javascript" onload="Handler(this)">
    2.     function Handler(script){
    3.         alert(script.tagName)
    4.     }
    5. </script>  
    Очень жаль, что решение не находится. Проблема все еще актуальна.
     
  20. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Короче, я понял, что ты хочешь. =)

    Вешай на класс, добавь в элемент дата-атрибут с нужными данными, возможно айдишник и всё. Одна функция на все случаи жизни работает с каждым элементом персонально.
     
  21. torrius

    torrius Активный пользователь

    С нами с:
    28 июн 2014
    Сообщения:
    35
    Симпатии:
    1
    Протестировал, во всех современных браузерах исполнение без нареканий, даже если добавить еще с десяток тегов <script> и до и после ))
    Первый alert выводить "undefined" может потому, что ваш браузер не поддерживает атрибут "data".
    строка return tags[tags.length-1] вернет <script> в котором вызвана, так как код читается и исполняется последовательно и на момент исполнения, последующих тэгов он еще не "видит", а значит как бы последний.

    Вот, попробуйте еще раз. Для наглядности, не стал создавать общую функцию:
    Код (Text):
    1.  
    2. <script type="text/javascript" id="script_1">
    3.          alert(document.getElementsByTagName('script')[document.getElementsByTagName('script').length-1].id);
    4. </script>
    5.  
    6. <script type="text/javascript" id="script_2"></script>
    7.  
    8. <script type="text/javascript" id="script_3">
    9.          alert(document.getElementsByTagName('script')[document.getElementsByTagName('script').length-1].id);
    10. </script>
    11.  
    12. <script type="text/javascript" id="script_4"></script>
    13.  
    14. <script type="text/javascript" id="script_5">
    15.          alert(document.getElementsByTagName('script')[document.getElementsByTagName('script').length-1].id);
    16. </script>
    17.  
    18. <script type="text/javascript" id="script_6"></script>
    19. <script type="text/javascript" id="script_7"></script>
     
  22. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    не делайте так, умоляю
     
  23. torrius

    torrius Активный пользователь

    С нами с:
    28 июн 2014
    Сообщения:
    35
    Симпатии:
    1
    Еще примитивней и понятней:
    Код (Text):
    1.  
    2. <script> alert(document.getElementsByTagName('script').length) </script>
    3. <script> alert(document.getElementsByTagName('script').length) </script>
    4. <script> alert(document.getElementsByTagName('script').length) </script>
    5. <script> alert(document.getElementsByTagName('script').length) </script>
    6. <script> alert(document.getElementsByTagName('script').length) </script>
    Каждый алерт выводит количество тэгов <script>, "прочитанных" на момент вызова.
     
  24. mpak

    mpak Активный пользователь

    С нами с:
    30 окт 2006
    Сообщения:
    440
    Симпатии:
    0
    Было бы так все просто я бы не создават этой темы.

    Чувак в теме очень подробно описал условия. Никаких меток быть не должно. Иначе вся работа прийдет к тому, что больше будешь выбирать id уникальный чем программировать. Путь я лучше три аса на поиск решения убью чем потом всю свою жизнь проверять есть ли у мен в коде повтояющиеся id или нет.

    Добавлено спустя 3 минуты 43 секунды:
    Во всех случаях у меня выдало одно и то же число использую chromium Подозреваю что в chrome результат будет такой же. А это большая часть интернетов.
     
  25. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    так расскажи, что же ты хочешь, чувак. Ты на вопрос нафиг тебе оно надо пишешь оно мне надо чтобы взять оттуда таг. Замкнутый круг.

    Эвенты вешаются через класс. Каждый объект может быть обработан индивидуально через дата-атрибуты. А ты опять велосипедишь.