Jump to content
  • 0

Правомерно ли использование onclick="javascript:;" ?


homm
 Share

Question

Зашел тут спор, на сколько правомерно использование префикса ?java script:? перед кодом реакции на события onXXX, где XXX?? название события. Является ли это чем-то значимым или это очередное расширение синтаксиса эксплорера, которое пришлось учитывать всем остальным браузерам. Собственно точки зрения на это 2:

Это якобы указатель языка, на котором написан обработчик

Это ничего не значащие символы, их использование опасно для здоровья страницы

Основной аргумент у первой точки знания, конечно же очевиден:

Типа так работает, какие тут могут быть сомнения:

onclick="perlscript:$window->document->MyForm->Text1->{'value'} = 'Hello, world!';"
<a href='#' onclick="java script:s='OK, it's done'; alert(s); return false;">click me!</a>

На этом аргументы у первой стороны заканчиваются.

Теперь приведу свои аргументы, однозначно указывающие, на мой взгляд, что запись java script: и perlscript: не только не полезна, но и вредна.

Итак, для начала проверим, является ли это способом указания языка скрпита. Проверим на таком примере:

<a href='#' onclick="abrakadabra:s='OK, it's done'; alert(s); return false;">click me!</a>

Во всех доступных мне браузерах эта конструкция работает так, если бы был указан язык javascript. Это значит, что при встрече незнакомого ?якобы идентификатора языка? брузер предполагает что это код на javascript. Это, в свою очередь значит, что при встрече кода на незнакомом языке любой браузер выдаст ошибку его интерпретации как яваскрипта (конечно, если синтксис незнакомого языка не идентичен синтаксису javascript, как в моем примере). А это уже значит, что использовать любой ?якобы идентификатора языка? кроме как javascript просто не безопасно.

Далее обратимся к документации http://www.w3.org/TR/REC-html40/interact/s...s.html#h-18.2.3

Там даны примеры обработчиков ?Intrinsic events? для разных языков. Как видите, onchange прописан прямо в свойствах тега только для javascript, для других языков используются другие способы назначения обработчиков, и конечно же нет никакого префикса java script:. И дуается мне, нет никакой возможности указать тип языка кода в обрабочиках событий, потому как само это содержимое обработчиков уже является кодом на языке javascript.

Добавлю только что под javascript в большенстве случаев я имею ввиду язык, выставленный по умолчанию для данного документа с помощью

Если кто-то все-же думает, что я ошибась, не могли бы вы аргументированно высказатся в чем, конкретно, только дествительно аргументированно, а не на уровне ?а че, так же все равно работает?. Охото уже разобратся с этим префиксом.

Link to comment
Share on other sites

7 answers to this question

Recommended Posts

  • 0
Если кто-то все-же думает, что я ошибаюсь, не могли бы вы аргументированно высказатся в чем, конкретно, только дествительно аргументированно, а не на уровне ?а че, так же все равно работает?.

А ч?, можем и аргументированно. :)

Это якобы указатель языка, на котором написан обработчик

Так и есть, указатель языка в определ?нный момент для определ?нного браузера. Товарищ Internet Explorer включает тот скриптовый язык по дефолту, который ему попался в первом же скриптовом блоке, если на странице гипотетический скриптовый коктейль, и первым стоит код vbscript, то все javascript-овые обработчики в тегах отваливаются, тупой пример:

<html>
<head>
<script type="text/vbscript"></script>
</head>
<body>
<a href="#" onclick="alert('test');">onclick=alert();</a>

<a href="#" onclick="java script:alert('test');">java script:onclick=alert()</a>
</body>
</html>

Первый работает, второй - нет. Одним из вариантов устранения этой проблемы в IE стала возможность прописывать в таких обработчиках т.н. индикатор протокола javascript (сами так назвали), тогда движок изолирует этот код от дефолтного скриптового языка, и работает jscript.dll. Это решение в годы некоторой гегемонии JScript растиражировали копипастеры, и понеслось. Тем более, что при отсутствии vbscript ничего страшного не происходит, только масло масляное... Браузеры, в которых таких проблем нет, теоретически и практически должны трактовать префикс java script: в обработчике как label (ECMAScript 12.12), конструкция в этом контексте не нужная, но при этом и не вызывающая ошибку (а жаль). Обычный label в сво?м нормальном предназначении работал бы так:

<html>
<body>
<a href="#" onclick="java script:while(1){break javascript;};alert('out-of-loop');">test</a>
</body>
</html>

Но такой дурью в инлайн обработчиках никто обычно не занимается, никто с label не извращается, никогда в жизни такого не видел. С вышеупомянутым же vbscript в IE тоже проблема наиредчайшая, мало, кто про не? вообще знает, отсюда можно констатировать, что индикатор протокола перед именем обрабочтика - в 99,999% случаев вещь совершенно бессмысленная. И даже вредная, если принять за истину то, что весь бессмысленный код вреден. Тем более если вспомнить, что инлайн обработчики или intrinsic events работают слегка за рамками стандарта javascript и могут в любой момент подложить любую каку. Вот.

Link to comment
Share on other sites

  • 0

Вообще, тут не просто разобрать, что к чему. В HTML 4.01 Specification ведь написано (там, где речь идет про intrinsic event):

The syntax of script data depends on the scripting language.

А как ПА должен узнать, что это за scripting language? Вроде бы ответ есть:

Authors should specify the default scripting language for all scripts in a document by including the following META declaration in the HEAD:

Более того, чуть ниже цитируемого есть пояснение:

Documents that do not specify default scripting language information and that contain elements that specify an intrinsic event script are incorrect. User agents may still attempt to interpret incorrectly specified scripts but are not required to.

Так вот, заодно комментируя высказывание:

Как видите, onchange прописан прямо в свойствах тега только для javascript, для других языков используются другие способы назначения обработчиков...

можно заметить, что если кто-то пожелает написать обработчик события onchange, к примеру, на VBScript, то пожалуйста, также, как и с js:

<input onchange='vb script:MsgBox "vbscript"'>

Вышеуказанный пример с onchange работает в IE. Opera, если я не ошибаюсь, следуя пожеланиям из спецификации, не пытается интерпретировать незнакомый синтаксис. А вот FF, несмотря на то, что в meta указан незнакомый ей язык, все равно пытается понять данные в обработчике и выдает ошибку.

Хотя я заметил, что содержимое тега meta (по крайней мере в оффлайн) не влияет ни на что. В том же IE, если убрать префикс vbscript, то будет вылетать сообщение о синтаксической ошибке. Он (IE), как отметил Zeroglif, включает дефолт несколько иначе. Выходит так, что браузеры не соответствуют спецификации.

Подобное как раз делает невозможным использование таких меток в кросс-браузерных html-документах.

Однако в черновике спецификации HTML 5 есть задумка реализовать The java script: protocol для URI атрибутов href/src, а также есть некоторые сомнения по поводу обработчиков событий:

How do we allow non-JS event handlers?

Так что, возможно, когда-нибудь префикс, указывающий браузеру на синтаксис, используемый в обработчике события, все же будет стандартизирован.

Link to comment
Share on other sites

  • 0

Спасибо огромное, очень приятно что здесь есть люди которые действительно подумали над этим вопросом :)

По поводу того, зачем и почему что так пишут в href я понял с самого начала, процитирую себя:

Кстати, указание ?java script:? в тексте ссылки не является расширением стандарта, что-то о чем-то говоряшем брузеру. Это всего лишь указание протокола, которым следует обрабатывать браузер следующую далее строку. И даже если в стандарте нет указания, что должен быть протокол ?java script:? и адрес по нему должен выполнятся, такая запись в ссылке все равно не является ущербной с точки зрения формата, браузер в праве реализовывать любые протоколы или открвать их внешними модулями при отсутствии реализации в нем самом.

Так что не смотря на то, что протокол java script: только собираются включить в стандарт, реально он работает везде уже очень давно :)

Браузеры, в которых таких проблем нет, теоретически и практически должны трактовать префикс java script: в обработчике как label (ECMAScript 12.12), конструкция в этом контексте не нужная, но при этом и не вызывающая ошибку (а жаль).

Вот, то, что нужно :)

Получается что любому браузеру приходится делать какие-то безсмысленные пасы, ради того что бы не навредить, т.к. у него нет никаких оснований предполагать чем является префикс с двоеточием, меткой или указателем на язык. Ява-код с меткой vb script: работает в брузерах, но не работает в ИЕ. Более того, узнать сработает ли код с другой меткой в ИЕ, можно будет только на конкретной машине, т.к. скриптовые языки в нем, насколько я знаю подключаются по типу плагинов. Отсюда следует, что и использование меток в обработсчиках проблематично, т.е. если ты задал метку tryagain:, нико не даст гарантии, что у пользователя не будет зарегестрированн движек tryagain.

Link to comment
Share on other sites

  • 0
Так что не смотря на то, что протокол java script: только собираются включить в стандарт, реально он работает везде уже очень давно

О том и речь ? возможно стандартизуют нечто подобное и в атрибутах обработчикав событий.

Ведь что сейчас мы видим ? дискриминация IE. Как я уже писал, несмотря на указания в стандарте, FF "ломает" документы, созданные под IE. Почему FF не реагирует на объявленный скриптовый язык?

И правильно, что об этом задумываются разработчики HTML 5, а также разработчики XHTML 2. ? на одном js свет клином не сошелся.

Получается что любому браузеру приходится делать какие-то безсмысленные пасы, ради того что бы не навредить, т.к. у него нет никаких оснований предполагать чем является префикс с двоеточием, меткой или указателем на язык.

В доках ведь есть упоминания о о multiscript language pages. Т.е. браузеры должны уметь различать языки, так ведь? А в Gecko, например, вместо нормальной реализации это просто сделано, как "костыль".

Отсюда следует, что и использование меток в обработсчиках проблематично, т.е. если ты задал метку tryagain:, нико не даст гарантии, что у пользователя не будет зарегестрированн движек tryagain.

Отсюда следует:

1. Задавая метку нужно отдавать себе отчет ? для чего она задается.

2. Есть поддержка или нет ? это другой вопрос, а вот то, что "лезть не в свое дело" ? это плохо (т.е. пытаться выполнить неизвестный код), браузеру должно быть известно.

Link to comment
Share on other sites

  • 0

Ну не знаю, на мой взгляд Gecko имеет полное моральное право реагировать как на метку, на то, что выглядит как метка, пока не появятся стандарты, говорящие об обратном. В текущих стандартах, как я понял, различие языков возможно только в тегах script. А в инлайновых обработчиках может быть только язык по умолчанию для страницы. Опера вроде тоже пытается выполнить inline конструкции вне зависимости от указанного префикса, но только в случае ошибки парсинга заглушает ее.

Другое дело, что ни один браузер не понимает Content-Script-Type, что уже хуже (чем считание префикса меткой, а не идентификатором), потому как это уже стандарт.

Link to comment
Share on other sites

  • 0
Ну не знаю, на мой взгляд Gecko имеет полное моральное право реагировать как на метку, на то, что выглядит как метка, пока не появятся стандарты, говорящие об обратном.

Вот как раз морального права не имеет. Надо научиться читать Content-Script-Type вместо того, чтобы сообщать об ошибках на веб-страницах, которые кто-то старательно создавал, используя, в силу каких-либо причин, язык, непонятный для FF.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy