28.07.2011, 18:06
|
Профессор
|
|
Регистрация: 29.06.2011
Сообщений: 445
|
|
monolithed, ну мы не обсуждаем, насколько это красивый стиль кодирования, мы говорим только о том, что это способ который по какой-то причине использует google. Кроме того, я не говорил, что они получают параметры именно таким способом, я лишь отметил, что это очень просто - получить переданные таким образом параметры.
Сообщение от monolithed
|
3. предположение, что этот дескриптор будет последним в документе.
|
Это не предположение. Так оно всегда и есть. Каждый из скриптов, на странице, когда он загружается является последним в момент его исполнения. Понимешь о чем, я?
|
|
28.07.2011, 18:19
|
|
⊞ Развернуть
|
|
Регистрация: 11.01.2010
Сообщений: 1,810
|
|
Сообщение от monolithed
|
2. есть вариант с пространствами имен:
|
Оно будет кроссбраузерно и не принесёт проблем с поисковиками?
|
|
28.07.2011, 18:23
|
Особый гость
|
|
Регистрация: 02.04.2010
Сообщений: 4,260
|
|
Сообщение от ваый
|
Каждый из скриптов, на странице, когда он загружается является последним в момент его исполнения.
|
Этот код не отработает:
<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>
Сообщение от B@rmaley.e><e
|
Оно будет кроссбраузерно и не принесёт проблем с поисковиками?
|
это альтернативное решение предложеное Google (и такой подход сейчас не редкость, - у Facebook так подключаются Like'и, при наличие смысла тянуть для этого API)
Последний раз редактировалось monolithed, 28.07.2011 в 18:32.
|
|
28.07.2011, 18:32
|
Профессор
|
|
Регистрация: 29.06.2011
Сообщений: 445
|
|
Сообщение от monolithed
|
Этот код не отработает:
<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);
Прекрасно работает.
Последний раз редактировалось ваый, 28.07.2011 в 18:44.
|
|
28.07.2011, 18:44
|
|
Профессор
|
|
Регистрация: 06.05.2008
Сообщений: 765
|
|
Не проверял во всех браузерах, но:
<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...
|
|
28.07.2011, 18:55
|
Профессор
|
|
Регистрация: 29.06.2011
Сообщений: 445
|
|
Сообщение от Snipe
|
Плюс очевиден - никакого eval.
|
Используйте JSON.parse, если хотите.
А по-моему, вот этот как раз-таки и не вариант вовсе, что вы предложили. Потому как это то, что выше monolithed назвал быдлокодингом.
|
|
28.07.2011, 18:57
|
|
Профессор
|
|
Регистрация: 06.05.2008
Сообщений: 765
|
|
Сообщение от ваый
|
Используйте JSON.parse, если хотите.
А по-моему, вот этот как раз-таки и не вариант вовсе, что вы предложили. Потому как это то, что выше monolithed назвал быдлокодингом.
|
Ну т.е. брать строку из innerHTML у тега, у которого никакого innerHTML по логике нет - это нормально?
А использовать такой же хак с удобным onclick - это быдлокодинг?
|
|
28.07.2011, 19:04
|
Профессор
|
|
Регистрация: 29.06.2011
Сообщений: 445
|
|
И то и другое - не очень, согласен. Но onclick все-таки ужаснее, потому что этот атрибут совсем не для этого предназначен. Тогда уже атрибут data. Я ж не спорю, что это спроный вопрос, о целесообразности такого метода с innerHTML. Я только говорю, что это можно удобно использовать.
Опять же - если так беспокоимся о семантичности, можно передавать параметры в самом URL в src, и просто разбирать, парсить URL.
<script src="domain.com/test.js?param=value"></script>
|
|
28.07.2011, 21:32
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
monolithed, это не JSON. как ты его отпарсишь?
Сообщение от Snipe
|
Ну т.е. брать строку из innerHTML у тега, у которого никакого innerHTML по логике нет - это нормально?
А использовать такой же хак с удобным onclick - это быдлокодинг?
|
да...
хм.
alert( typeof HTMLScriptElement.innerHTML ); // undefined
где это свойство?
поискал, нигде нет.
Последний раз редактировалось melky, 28.07.2011 в 21:39.
|
|
28.07.2011, 21:44
|
Особый гость
|
|
Регистрация: 02.04.2010
Сообщений: 4,260
|
|
Сообщение от melky
|
это не JSON. как ты его отпарсишь?
|
alert(eval('(' + "{foo : 1}" + ')').foo);
на всякий:
alert(
({
foo : 'text'
}).foo.toUpperCase()
);
|
|
|
|