【问题标题】:Why following javascript is not working in Internet Explorer & Mozilla but works fine in google chrome?为什么以下 javascript 在 Internet Explorer 和 Mozilla 中不起作用,但在 google chrome 中运行良好?
【发布时间】:2015-02-05 18:24:26
【问题描述】:

我在我的 javascript 中获取会话属性,然后在 if-else 中使用它。 该脚本应该在用户某些锚标签点击锚标签时运行。

<a id="someId" href="/someurl" onClick="checkSession(this.id)">Link</a>

<a id="someOtherId" href="/someurl" onClick="checkSession(this.id)">Link2</a>

在体内

<script type="text/javascript">

    function checkSomething(clickedId){     

        event.preventDefault();     
        var value= <%=(int) session.getAttribute("key")%>;

        if(value != -1){
            window.location = $('#'+clickedId).attr('href');
        }else {
            alert("Please Select a value first then click on the link.");
            $("#someInput").focus();
        }

    };


</script>

脚本在 chrome 上完美运行,但在 mozilla 和 IE 上失败。 在 mozilla 上,我可以看到锚标记已与该 javascript 绑定,但它没有运行。

【问题讨论】:

  • 您必须从内联处理程序中传递 event 对象。如果您查看控制台,您会发现“事件未定义”错误。看起来你会使用jQuery,为什么不通过jQuery分配事件?
  • 感谢理解错误!!!虽然如果它无论如何都能工作会很好,

标签: javascript jquery google-chrome internet-explorer firefox


【解决方案1】:

传入事件而不是 ID。此外,您不需要 jQuery 来获取元素的 href。只需使用原生 JavaScript:

<a id="someId" href="/someurl" onClick="checkSession(event)">Link</a>   
<a id="someOtherId" href="/someurl" onClick="checkSession(event)">Link2</a>

<script>
    function checkSession(event) {
        event.preventDefault();
        var clickedId = event.target.id;
        var href = event.target.href; 

        // etc
    }
</script>

【讨论】:

  • 感谢理解错误!!!虽然如果它无论如何都能工作会很好,
【解决方案2】:

您也可以:

<a id="someId" href="javascript:checkSession('/someurl')">Link</a>   
<a id="someOtherId" href="javascript:checkSession('/someOtherurl')">Link2</a>

<script>
    function checkSession(url) {
      var value= <%=(int) session.getAttribute("key")%>;

      if(value != -1){
          window.location = url;
      } else {
          alert("Please Select a value first then click on the link.");
          $("#someInput").focus();
      }

    }
</script>

【讨论】:

  • 请不要使用javascript: 协议。而是使用 addEventListener 绑定处理程序或使用 jQuery 之类的工具。
  • 具有 HREF 属性的锚标记具有默认的 EventHandling 以转到指定的 HREF。通过使用 onclick,您必须覆盖锚标记的默认行为。 javascript: 是所有浏览器完全支持的功能,并且已经使用了几十年。如果您只想使用 onclick,请使用按钮并将其设置为看起来像锚标记。在这种情况下,您正在做额外的工作并不必要地覆盖锚标记的默认行为。
  • 我知道您需要阻止默认操作,但这样做比使用 JavaScript 协议要好得多。恕我直言,额外的工作(老实说,工作量不大)远好于延续一个糟糕的模式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-28
  • 1970-01-01
  • 2013-06-23
  • 2020-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多