2010-09-10 2 views
0

Я никогда не видел этого раньше, но вы можете вызывать атрибут HREF ссылки, используя javascript, если HREF содержит javascript:; // code ......;Вызов атрибута HREF ссылки с javascript с помощью javascript!

На моем примере ниже нажмите на обе ссылки. они делают то же самое, хотя у них есть другой javascript в HREF.

, например:

 <script type="text/javascript"> 
      function clickme() 
      { 
       var link = document.getElementById("clickme"); 
       eval(link.href); 
      } 
    </script> 
    <a id="clickme" href="javascript:alert('hello');">I will alert hello</a> 
    <br /> 
    <a href="javascript:clickme()">click me</a> 

Я испытал это на IE8, Firefox 3.6.8, Safari 5.0.1 и Chrome 6.0.472.55. Является ли это стандартизованным, поэтому мне не придется беспокоиться о том, что эта функция не рекомендуется в будущем?

+2

Ответ: вы не должны этого делать. – strager

ответ

4

Вам не нужно беспокоиться о том, что это не рекомендуется в будущем. Плохая идея сейчас.

Что действительно происходит: есть ссылка, использующая протокол javascript:, который соблюдается браузерами. Это означает, что все, что следует за javascript:, является JavaScript и должно выполняться интерпретатором JS.

Когда вы извлекаете ссылку href ссылки, вы получаете ее как строку, например. "JavaScript: ClickMe()". Вы можете использовать eval для строк для выполнения JavaScript. Теперь вы бы подумали, что это не сработает (из-за функции протокола javascript: на передней панели), но это не так, потому что у JavaScript есть ярлыки, и это выглядит как ярлык, когда вы рассматриваете его как код JavaScript.

Так оно работает, но это плохая идея. Он также запрещен (из-за eval) в новом «строгом» режиме последней версии JavaScript, ECMAScript 5th edition.

В целом, когда мы думаем, что для чего-то нужно использовать eval, это указывает на то, что в нашем коде есть проблемы и что некоторые рефакторинг в порядке. Исключения из этого правила являются очень краткими краевыми случаями, с которыми большинство из нас никогда не столкнутся. В этом случае вместо того, чтобы иметь атрибут href, мы должны использовать код, который мы хотим выполнить, он должен только использовать код, который мы хотим выполнить. Например, ваш пример имеет функцию clickMe как единственное, что используется. Вместо этого нужно просто вызвать эту функцию напрямую.

+0

Хорошее объяснение этикетки. –

+1

Eval часто используется в .NET, особенно для инструментария ajax. Кроме того, Eval очень необходим в моем случае, потому что я пытаюсь выполнить событие click для элемента Link Button. Я не чувствую необходимости снимать код, привязывать его к событию клика и вызывать его. – Robert

+0

@ncaatrackstar: Тот факт, что инструментарий .Net использует 'eval', не является аргументом, что это хорошо. ;-) И это не * необходимо в вашем случае, это выбор, который вы делаете. Это нормально, это ваш выбор, но это совершенно не обязательно. –

0

Я думаю, ваш вопрос, является ли линия

eval(link.href); 

является действительным.

Ответ на этот вопрос - да. Нет причин, по которым вы не можете оценить код, который хранится в каком-либо свойстве, так же, как вы могли бы оценить содержимое поля ввода.

Это говорит о том, что это очень хороший способ кодирования вещей. Если вы не будете осторожны, вы можете оказаться в круговом цикле. Кроме того, такой код будет очень сложно поддерживать.

+0

Спасибо, Пол. Я не думал, что javascript: // и некоторый код; был рассмотрен код, который можно было бы оценить. – Robert

+0

Это не ... // не работает правильно. Ответ T.J. имеет хорошее объяснение. –

1

Это не будет устаревшим, но я не вижу его использования.

Если вы хотите, чтобы струя этого больше делать:

<script type="text/javascript"> 
      function clickme() 
      { 
       clicked(); 
      } 
      function clicked() 
      { 
       alert("hello"); 
      } 

    </script> 
<a id="clickme" href="javascript:clicked();">I will alert hello</a> 
<br /> 
<a href="javascript:clickme()">click me</a> 

Или еще лучше сделать:

<a href="#" onclick="clicked();">Click Me</a> 

Или еще лучше: управление

<span onclick="clicked();" class="MakeMeLookLIkeLInk">Click Me</a> 

Якорь в основном используются для навигации, и как хорошая практика держать его таким образом. если у вас есть функциональность, которая должна иметь место, используйте span/div с onclick. Вы также можете использовать кнопку.

Смежные вопросы