Вызов атрибута HREF ссылки с помощью javascript с использованием javascript! - PullRequest
0 голосов
/ 11 сентября 2010

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

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

например:

     <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. Это стандартизировано, поэтому мне не придется беспокоиться об устаревании этой функции в будущем?

Ответы [ 3 ]

4 голосов
/ 11 сентября 2010

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

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

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

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

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

1 голос
/ 11 сентября 2010

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

Если вы хотите использовать потоковую линию, сделайте следующее:

 <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 с помощью щелчка мышью.Вы также можете использовать кнопку.

0 голосов
/ 11 сентября 2010

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

eval(link.href);

действителен.

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

Тем не менее, это выглядит как ОЧЕНЬ плохой способ кодирования вещей. Если вы не будете осторожны, вы можете оказаться в круговой петле. Кроме того, подобный код будет очень сложно поддерживать.

...