Тэг <script> - src и код одновременно?
Смотрю на генератор кнопки + от Google:
http://www.google.com/webmasters/+1/button/ Если выбрать какой-нибудь язык отличный от английского, то гугл генерит следующий текст: <script type="text/javascript" src="https://apis.google.com/js/plusone.js"> {lang: 'ru'} </script> Что это значит, ведь по канонам это бессмысленно? |
ну валидацию, да, не пройдет.
но с другой стороны удобно. браузер просто проигнорирует внутреннюю вставку, в то время как скрипт plusone.js может получить нужные параметры {lang: 'ru', ...} и использовать их для своих нужд. |
Цитата:
|
Цитата:
|
Цитата:
|
e1f, ваый,
Очевидно, но это же полнейшая тупость, когда есть масса нормальных способов (назначить идентификатор, атрибут и пр.). Не понимаю, для чего такие сложности ? ;) |
Ну это нужно у инженеров гугл спрашивать. А мне кажется, что это довольно удобный способ для задания конфигурационных параметров. А что, получить строку с параметрами {lang: 'ru'} проще простого, преобразовать в объект, еще проще. Это лучше, чем передавать параметры в атрибуте src.
monolithed, а как тебе кажется лучше было бы? |
как получить этот innerHTML из скрипта ?прошу пример ,ваый !
мне кажется, что так. var a = document.getElementsByTagName('script'), b = a.length, options = {}; while( b-- ) if ( ~a[i].src.indexOf("plusone.js") ) options = JSON.parse ( a[i].innerHTML ); alert( options.lang ); // ru ? |
melky, можно изящнее.
Полагаю как-то так должно прокатить: var scripts = document.getElementsByTagName('script'); var thisScript = scripts[scripts.length - 1]; var params = eval('(' + thisScript.innerHTML + ')');Этот код располагается внутри самого скрипта, который загрузился. Здесь учитывается, что этот самый скрипт на момент загрузки будет самым последним из всех скриптов. |
ваый,
можете не согласиться, однако: 1. наличие кода внутри дескрипторов script с атрибутом src 2. такой способ получения и обработки данных 3. предположение, что этот дескриптор будет последним в документе. признак быдлокодерства. Цитата:
//заполнено образно google.load("plusone", {lang : 'ru'}); gapi.plusone.render("plusone", {lang : 'ru'}); 2. есть вариант с пространствами имен: <script type="text/javascript" src="https://apis.google.com/js/plusone.js"></script> <g:plusone></g:plusone> |
monolithed, ну мы не обсуждаем, насколько это красивый стиль кодирования, мы говорим только о том, что это способ который по какой-то причине использует google. Кроме того, я не говорил, что они получают параметры именно таким способом, я лишь отметил, что это очень просто - получить переданные таким образом параметры.
Цитата:
|
Цитата:
|
Цитата:
<script type="text/javascript" src="https://apis.google.com/js/plusone.js">{lang: 'ru'}</script> <script type="text/javascript"> var scripts = document.getElementsByTagName('script'); alert(eval('(' + scripts[scripts.length - 1].innerHTML + ')').lang); </script> Цитата:
|
Цитата:
Конечно, не отработает. Но я утверждаю, что следующий код отработает: <script type="text/javascript" src="domain.com/script.js"> {lang: 'ru'} </script> Содержимое script.js: var scripts = document.getElementsByTagName('script'); alert(eval('(' + scripts[scripts.length - 1].innerHTML + ')').lang); Я же о том и говорю, что сам скрипт, указанный в атрибуте src, может получить легко доступ к содержимому своего же собственного тэга script. Пруф: <html> <head></head> <body> <script> var a = 21; </script> <script src="test.js"> {'lang': 'ru'} </script> <script> var b = 17; </script> </body> </html> test.js: var scripts = document.getElementsByTagName('script'); var thisScript = scripts[scripts.length - 1]; var params = eval('(' + thisScript.innerHTML + ')'); alert(params.lang); Прекрасно работает. |
Не проверял во всех браузерах, но:
<script type="text/javascript" src="domain.com/script.js" onclick="return {a: 'a'}"></script> <script type="text/javascript"> var b = document.getElementsByTagName('script')[0].onclick(); alert(b.a); </script> Плюс очевиден - никакого eval. С другой стороны, не разбирался, как onclick себя вести должен у тега script... |
Цитата:
А по-моему, вот этот как раз-таки и не вариант вовсе, что вы предложили. Потому как это то, что выше monolithed назвал быдлокодингом. |
Цитата:
А использовать такой же хак с удобным onclick - это быдлокодинг? :blink: |
И то и другое - не очень, согласен. Но onclick все-таки ужаснее, потому что этот атрибут совсем не для этого предназначен. Тогда уже атрибут data. Я ж не спорю, что это спроный вопрос, о целесообразности такого метода с innerHTML. Я только говорю, что это можно удобно использовать.
Опять же - если так беспокоимся о семантичности, можно передавать параметры в самом URL в src, и просто разбирать, парсить URL. <script src="domain.com/test.js?param=value"></script> |
monolithed, это не JSON. как ты его отпарсишь?
Цитата:
да... хм. alert( typeof HTMLScriptElement.innerHTML ); // undefined где это свойство? поискал, нигде нет. |
Цитата:
alert(eval('(' + "{foo : 1}" + ')').foo); на всякий: alert( ({ foo : 'text' }).foo.toUpperCase() ); |
|
А еще можно взять тег, внутрь которого написали что-то, отрезать ему src и вставить его еще раз. Тогда JS внутри выполнится.
Нет? :) |
Цитата:
Цитата:
кстати, передачу через onclick вообще для чего придумали? |
Цитата:
|
Цитата:
Я же для себя лично отметил, что использование innerHTML для передачи внешних параметров в загружаемый скрипт - достаточно прикольный и удобный способ. Я уже выше писал, что альтернативой могут быть параметры в URL в src, но по сравнению с innerHTML этот способ sucks. Про атрибуты типа onclick вообще молчу. |
Цитата:
Цитата:
|
Мне кажется, что мы говорим о разных вещах. Как мне может помочь textarea в данном случае?
Цитата:
|
x-yuri,
Цитата:
Цитата:
Цитата:
Скажем, так я высказал личное мнение, не более |
Цитата:
|
Цитата:
|
Цитата:
В общем, все может быть, но я бы так делать делать не стал. |
Ну тот факт, что этот вариант использует google, уже внушает доверие, разве нет? К тому же такой метод уже лет десять как используют, опять же по причине простоты и кроссбраузерности. Вот, кстати, нарыл доказательство, кто не верит http://feather.elektrum.org/book/src.html
|
Цитата:
Цитата:
другие шаблонизаторы тоже бывает textarea используют Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
<!doctype html> <html> <body> <script src="1.js"></script> <script src="2.js"></script> <script src="3.js"></script> <script> d([a, b, document.body.innerHTML]); function d(s){ document.body.appendChild( document.createTextNode(s) ); document.body.appendChild( document.createElement('br') ); } </script> </body> </html> 1.js: var a = 1; 2.js: var scripts = document.getElementsByTagName('script'); var script = scripts[scripts.length-1]; script.parentNode.insertBefore(document.createTextNode('test'), script); 3.js: var b = 2; не нашел браузера, в котором это не работает. Почему это плохой тест (почему такой метод доступа к тегу скрипт может не работать) и как его можно улучшить? p.s. вообще, я в последнее время подумал, что слишком сильно себя ограничиваю. Надо больше экспериментировать. |
Цитата:
Цитата:
|
Цитата:
|
а что значит полная? У меня следующий код работает и в ie 8:
Element.prototype.testMethod = function() { alert("test"); } document.body.testMethod(); или это не полная поддержка? |
Цитата:
|
У нас в вебвизоре предлагался вот такой код для вставки на сайты
<script type="text/javascript"> document.write('<script\u0020type="text/javascript"\u0020id=":visorCode"><\u002fscript>'); var __visorInit=new Function('','if(typeof(__visor)!="undefined")__visor.init(100);'); var __visorConnect=new Function('','document.getElementById(":visorCode").src="//c1.web-visor.com/c.js"'); if(Object.prototype.toString.call(window.opera)=='[object\u0020Opera]') document.addEventListener('DOMContentLoaded',__visorConnect,false); else __visorConnect(); </script> Он выглядит очень дико, но каждая буковка здесь имеет свою предпосылку. Это я к тому, что глупо обсуждать какое-либо решение, не зная предпосылок, которые привели к этому решению. |
Kolyaj, ну расскажи нам об этих предпосылках.
фича с исполнением скриптов по мере загрузки страницы не работает в гекко в режиме xhtml. там сначала строится дерево, а только потом исполняются скрипты. соответствнено и document.write не работает. пространства имён вполне кроссбраузерны. если опять же не пользоваться xhtml парсором. |
Цитата:
Используется, потому что удобно (не надо ничего парсить, можно не просто передавать данные, а выполнять функции), кроссбраузерно и не лезет в innerHTML (актуально для элементов верстки, к которым надо подключить JS). |
Часовой пояс GMT +3, время: 23:32. |