我不理解的2个不同功能之间的Javascript行为

时间:2019-05-08 14:14:55

标签: javascript

我是不熟悉前端技术的Java开发人员,所以我希望这个问题不要太愚蠢。我在html页面上内联了2个脚本。

<script type="text/javascript">
        function printReceipt(orderId,email) {
            var printWindowSettings;
            var browserUserAgent = navigator.userAgent;

            if (browserUserAgent.indexOf("Chrome") > -1) {
                printWindowSettings = "status=0,toolbar=0,menubar=0,height=500,width=1000,scrollbars=1";
            } else {
                printWindowSettings = "status=0,toolbar=0,location=0,menubar=0,height=500,width=1000,scrollbars=1,noopener=1";
            }

            var path = "/shop/printReceipt?orderid="+orderId;
            if (email!=null)
                path+="&email=" + email; 
            var docPrint = window.open(path, '_blank', printWindowSettings);
            if (docPrint == null) console.log("window open returned null");
        }
    </script>

    <script type="text/javascript">
        bajb_backdetect.OnBack = function()
        {
            window.history.back=function(){
              console.log("Back Button Pressed.")
              document.location='/shop/shoppingCart.seam';
            }
        }
    </script>
在锚标签的printReceipt()处理程序中调用

onClick()

<div class="pull-left" style="padding-bottom:20px;"><a href="#" onclick="javascript:printReceipt(apaOrder.orderId);" class="btn btn-primary-custom"><i class="fa fa-print" aria-hidden="true" style="padding-right:6px;"></i>Print Receipt</a></div>

我发现的是,当调用printReceipt()时,也会调用以下脚本(用于管理后退按钮)。因此,当调用printReceipt()时,我的浏览器导航到/shop/shoppingCart.seam

为什么会这样?我该如何解决?

2 个答案:

答案 0 :(得分:1)

我对您的问题进行了一些研究,并且由于您提到您使用的是第三方脚本(对于开发人员而言,这并不总是最好的),所以我发现了一些可以帮助您摆脱它的东西。 / p>

此方法将需要您删除已经拥有的第三方脚本(或对其进行注释)。由于我们将以其他方式处理后退按钮。

脚本标记中,您具有以下代码:

bajb_backdetect.OnBack = function() {
    window.history.back = function() {
        console.log("Back Button Pressed.")
        document.location = '/shop/shoppingCart.seam';
    }
}

用以下代码替换它:

(function(window, location) {
history.replaceState(null, document.title, location.pathname+"#!/history");
history.pushState(null, document.title, location.pathname);

window.addEventListener("popstate", function() {
  if(location.hash === "#!/history") {
    history.replaceState(null, document.title, location.pathname);
    setTimeout(function(){
      location.replace("/shop/shoppingCart.seam"); //Here goes your URL 
    },0);
  }
}, false);
}(window, location));

现在,如果确实删除了第三方脚本(或添加了注释),则应该能够看到预期的行为。

如果您想了解更多有关此的信息,则已经回答了一个与此问题类似的问题,即处理窗口后退事件的最佳方法是自己完成。

我从this answer获取了此信息,并在其中加上了针对您特定问题的解释和代码。希望对您有所帮助。

注意: 如果仍然无法使用,则您需要提供代码的更开放的上下文,因为可能会导致其他原因不起作用。

答案 1 :(得分:0)

单击锚点可能导致浏览器跟随该链接。

给出此:

<a href="" onclick="printReceipt(10, 'person@site.com')">click me</a>

单击该链接将运行该功能,然后页面将重新加载。您的后退检测脚本将注意到该页面正在被卸载并且正在处理(显然)。

将其更改为:

<a href="" onclick="printReceipt(10, 'person@site.com'); return false">click me</a>

为了防止链接被跟踪。