Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Тэг <script> - src и код одновременно? (https://javascript.ru/forum/misc/19194-tehg-script-src-i-kod-odnovremenno.html)

ваый 28.07.2011 18:06

monolithed, ну мы не обсуждаем, насколько это красивый стиль кодирования, мы говорим только о том, что это способ который по какой-то причине использует google. Кроме того, я не говорил, что они получают параметры именно таким способом, я лишь отметил, что это очень просто - получить переданные таким образом параметры.
Цитата:

Сообщение от monolithed (Сообщение 115876)
3. предположение, что этот дескриптор будет последним в документе.

:) Это не предположение. Так оно всегда и есть. Каждый из скриптов, на странице, когда он загружается является последним в момент его исполнения. Понимешь о чем, я?

B@rmaley.e><e 28.07.2011 18:19

Цитата:

Сообщение от monolithed
2. есть вариант с пространствами имен:

Оно будет кроссбраузерно и не принесёт проблем с поисковиками?

monolithed 28.07.2011 18:23

Цитата:

Сообщение от ваый
Каждый из скриптов, на странице, когда он загружается является последним в момент его исполнения.

Этот код не отработает:
<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)

ваый 28.07.2011 18:32

Цитата:

Сообщение от monolithed (Сообщение 115886)
Этот код не отработает:
<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);

Прекрасно работает.

Snipe 28.07.2011 18:44

Не проверял во всех браузерах, но:
<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

Цитата:

Сообщение от Snipe (Сообщение 115896)
Плюс очевиден - никакого eval.

Используйте JSON.parse, если хотите.
А по-моему, вот этот как раз-таки и не вариант вовсе, что вы предложили. Потому как это то, что выше monolithed назвал быдлокодингом.

Snipe 28.07.2011 18:57

Цитата:

Сообщение от ваый (Сообщение 115898)
Используйте JSON.parse, если хотите.
А по-моему, вот этот как раз-таки и не вариант вовсе, что вы предложили. Потому как это то, что выше monolithed назвал быдлокодингом.

Ну т.е. брать строку из innerHTML у тега, у которого никакого innerHTML по логике нет - это нормально?

А использовать такой же хак с удобным onclick - это быдлокодинг? :blink:

ваый 28.07.2011 19:04

И то и другое - не очень, согласен. Но onclick все-таки ужаснее, потому что этот атрибут совсем не для этого предназначен. Тогда уже атрибут data. Я ж не спорю, что это спроный вопрос, о целесообразности такого метода с innerHTML. Я только говорю, что это можно удобно использовать.
Опять же - если так беспокоимся о семантичности, можно передавать параметры в самом URL в src, и просто разбирать, парсить URL.
<script src="domain.com/test.js?param=value"></script>

melky 28.07.2011 21:32

monolithed, это не JSON. как ты его отпарсишь?

Цитата:

Сообщение от Snipe (Сообщение 115899)
Ну т.е. брать строку из innerHTML у тега, у которого никакого innerHTML по логике нет - это нормально?

А использовать такой же хак с удобным onclick - это быдлокодинг? :blink:


да...

хм.

alert( typeof HTMLScriptElement.innerHTML ); // undefined


где это свойство?
поискал, нигде нет.

monolithed 28.07.2011 21:44

Цитата:

Сообщение от melky
это не JSON. как ты его отпарсишь?

alert(eval('(' + "{foo : 1}" + ')').foo);


на всякий:

alert(
	({
	   foo : 'text'
	}).foo.toUpperCase()
);


Часовой пояс GMT +3, время: 23:52.