В такой конструкции <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] // Выдает всегда последний В случае если скрипт не последний последняя строка не работает. Подскажите пожалуйста как мне найти текущий скрипт?
Можно отталкиваться от этого Код (PHP): <!DOCTYPE html> <html> <body> <script> function myFunction() { var js = document.getElementsByTagName("script"); for (var i = 0; i < js.length; i++) { alert(js[i].innerHTML); } } </script> <script> function myFunction2() { alert('hello js'); } </script> <button onclick="myFunction()">Try it</button> </body> </html>
Этот способ я знаю. Но он меня не устраивает тем, что требует наличия уникальных id или классов. Хотелось бы просто скопировать код в другую верстку и чтобы он сразу же стал работать без расстановки идентификаторов и проверки на наличие оных в новой верстке. Я написал выше что ищу решение без них.
Не увидел решение. Где в нем ссылка на текущий script и его получение? Что то наподобии такого хотел бы получить var curScript = document.scripts[document.scripts.length-1] но это строка указывает на последний скрипт в коде. А мне нужно, чтобы на текущий.
нет же. Нужно такое <script> var curScript = document.scripts[document.scripts.length-1]; </script> только на текущий скрипт.
В этом и вопрос. Как из скрипта получить ссылку на tag script текущего скрипта? Задача нужна, чтобы привязаться к dom обьектам где физически расположен скрипт, получить dom родителя в котором лежит текст скрипта.
Можем, но меня этот способ не устраивает. Хочется именно без дополнительных телодвижений, так как планирую двигать скрипт по дом обьекту. И он длжен работать всегда с элементом в котором расположен. Плюс нужно проверять, чтобы небыло уже элементов с таким id или class это тоже усложняет подобное решение и вносит ошибки в случае если такие дубликаты будут. Интересен вариант без отметок есть же внутри функций метки на саму себя arguments.callee() что то подобное для скриптов есть интересно?
Сейчас я так и делаю. Но хотел бы уйти от этого способа. Так как если найти то, что я ищу можно будет скрипт вставлять в код динамически или в не свою верстку, не придумывая id. Ну или как вариант даже если поставить. Я хочу их поставить скриптом. Как мне до этого элемента добраться. В этом проблема. Как скриптом поставить самому себе id? Замкнутый круг какой то... Я не могу до него добраться так как не знаю его id и поставить его я тоже не могу, так как не могу до него добраться.
Ну тогда можно назвать в скрипте одну переменную опять же уникально, например var gdfTdsjd433sjd потом получить все script и через регулярные выражения найти в исходнике var gdfTdsjd433sjd и присвоить этому тегу id или так делать каждый раз
Скопировать данный скрипт не получится без изменения кода. Так как придется менять значение этой переменной. ОТ чего хотел уйти к тому снова возвращаюсь. Что то не верю что способа нет. Должен быть. Меня аж проберает когда понимаю что получается что с кода вообще никак нельзя привязаться к dom обьекту где этот код написан. Ужос какой то. Как мне кажется должны быть какие то методанные по всем скриптам. Их код, номер по порядку еще что нибудь. Как то по ним думаю можно. Добавлено спустя 12 минут 8 секунд: Вот похоже что то нарыл https://rawgit.com/JamesMGreene/fb4a71e060da6e26511d/raw/76 ... tScript.js
Здесь не плохо описана проблема. Один к одному про то, что я спрашивал. http://xpoint.ru/forums/programming/javascript/misc/thread/36850.xhtml
неплохо если нет отрицания, например "не плохо, а ужасно", то пишется вместе, если нет третьего слова, например "не очень плохо".
Код (Text): <script type="text/javascript"> function getThisScript(){ var tags = document.getElementsByTagName('script'); return tags[tags.length-1]; } </script> <script type="text/javascript" data-name='lalala'> alert(getThisScript().getAttribute('data-name')); </script> <script type="text/javascript"></script> <script type="text/javascript" id="blabla"> alert(getThisScript().id); /* функция getThisScript() возвращает текущий script (в котором вызвана)*/ </script> Вот только где это может быть надо на практике?
Я уже запускал такую реализацию. Судя по всему вы недостаточно протестировали свой код. Первый alert выводит "undefined" а последний "blabla". Это происходит потому, что в строка return tags[tags.length-1]; всегда вернет последний скрипт из созданных на странице. То есть чтобы использовать ваш код нужно быть уверенным, что за скриптом больше не будет вставок других скриптов. В реальной жизни я не могу быть в этом уверенным. К сожалению приходится работать с множественными вставками данной конструкции. И нужно найти реализацию, которая выберет именно текущий тег скрипта. Выше я уже указывал для чего планирую использовать данную конструкцию. Она будет навешивать события на тег в котором расположен скрипт. Вот здесь описана такой же подход как и мой. Но насколько я понимаю решение у них так и не было найдено. http://xpoint.ru/forums/programming/javascript/misc/thread/36850.xhtml Вот этот вариант где то очень близко к решение, но у меня на хромиумен это не заработало. Подозреваю что если у меня не заработало, значит и на большей части остальных браузеров тоже не будет работать. Код (Text): <script type="text/javascript" onload="Handler(this)"> function Handler(script){ alert(script.tagName) } </script> Очень жаль, что решение не находится. Проблема все еще актуальна.
Короче, я понял, что ты хочешь. =) Вешай на класс, добавь в элемент дата-атрибут с нужными данными, возможно айдишник и всё. Одна функция на все случаи жизни работает с каждым элементом персонально.
Протестировал, во всех современных браузерах исполнение без нареканий, даже если добавить еще с десяток тегов <script> и до и после )) Первый alert выводить "undefined" может потому, что ваш браузер не поддерживает атрибут "data". строка return tags[tags.length-1] вернет <script> в котором вызвана, так как код читается и исполняется последовательно и на момент исполнения, последующих тэгов он еще не "видит", а значит как бы последний. Вот, попробуйте еще раз. Для наглядности, не стал создавать общую функцию: Код (Text): <script type="text/javascript" id="script_1"> alert(document.getElementsByTagName('script')[document.getElementsByTagName('script').length-1].id); </script> <script type="text/javascript" id="script_2"></script> <script type="text/javascript" id="script_3"> alert(document.getElementsByTagName('script')[document.getElementsByTagName('script').length-1].id); </script> <script type="text/javascript" id="script_4"></script> <script type="text/javascript" id="script_5"> alert(document.getElementsByTagName('script')[document.getElementsByTagName('script').length-1].id); </script> <script type="text/javascript" id="script_6"></script> <script type="text/javascript" id="script_7"></script>
Еще примитивней и понятней: Код (Text): <script> alert(document.getElementsByTagName('script').length) </script> <script> alert(document.getElementsByTagName('script').length) </script> <script> alert(document.getElementsByTagName('script').length) </script> <script> alert(document.getElementsByTagName('script').length) </script> <script> alert(document.getElementsByTagName('script').length) </script> Каждый алерт выводит количество тэгов <script>, "прочитанных" на момент вызова.
Было бы так все просто я бы не создават этой темы. Чувак в теме очень подробно описал условия. Никаких меток быть не должно. Иначе вся работа прийдет к тому, что больше будешь выбирать id уникальный чем программировать. Путь я лучше три аса на поиск решения убью чем потом всю свою жизнь проверять есть ли у мен в коде повтояющиеся id или нет. Добавлено спустя 3 минуты 43 секунды: Во всех случаях у меня выдало одно и то же число использую chromium Подозреваю что в chrome результат будет такой же. А это большая часть интернетов.
так расскажи, что же ты хочешь, чувак. Ты на вопрос нафиг тебе оно надо пишешь оно мне надо чтобы взять оттуда таг. Замкнутый круг. Эвенты вешаются через класс. Каждый объект может быть обработан индивидуально через дата-атрибуты. А ты опять велосипедишь.