【问题标题】:Javascript / jQuery page change event on mobile browsers移动浏览器上的 Javascript / jQuery 页面更改事件
【发布时间】:2023-03-27 22:58:01
【问题描述】:

我正在设计一个移动网站,同时考虑到所有领先的浏览器 - Safari、Chrome、Dolphin、Opera。

我想在页面导航/更改/请求新页面时显示“加载”元素

我不能在锚标记上使用点击事件,因为preventDefault(); 存在很多。

我尝试了以下方法:

$(window).on('beforeunload', function() { ... });

但它在 DolphinOpera 中不起作用。

谁能推荐一个跨浏览器解决方案

--

编辑:我意识到我问的不是很清楚,抱歉。我根据响应在这里创建了一个小提琴-http://jsfiddle.net/hiteshpachpor/7dadA/5/。该示例使用了事件冒泡。

现在这是我面临的问题。每次页面更改/导航时,我都会显示该加载程序 ($('.jacket').show();)。但是如果单击链接,我不希望它显示出来;我想在我的页面上执行其他操作。现在,在所有此类操作中添加 $('.jacket').hide(); 行就足够了,但出于扩展原因,它并不是非常理想。

这就是我评估 'beforeunload' 方法的原因,但没有运气,因为它不兼容跨浏览器。

有什么好的建议来解决这个问题?

【问题讨论】:

  • @Devima 这是一个单页应用还是有实际的页面加载?
  • 为什么不能使用点击事件处理程序? preventDefault() 将阻止页面在链接点击时发生变化,但它不会阻止事件在 DOM 中冒泡。
  • @Jasper - 我最初的想法也是一样的。但这是我的限制:有不少事件使用preventDefault()。随着项目的进展,我可能会在以后添加更多内容。如果我开始手动考虑这些事件/元素,那么它只会使我的代码非常僵化和静态。这迫使我首先评估onbeforeunload 事件。但它似乎不适用于大多数移动浏览器。
  • 这就是赏金的原因

标签: javascript jquery google-chrome opera dolphin-browser


【解决方案1】:

响应您的编辑:

您可以使用event.isDefaultPrevented()

$(function() {
    $('.jacket').hide();

    $('.prevent').click(function(event) {
        event.preventDefault();
    });

    $('a').click(function(event) {
        if (!event.isDefaultPrevented())
            $('.jacket').show();
    });
});

JSFiddle:http://jsfiddle.net/F4uPx/

警告:确保在其他事件处理程序之后分配 $('a').click() 事件处理程序;否则它将首先执行并且会失败,因为preventDefault() 还没有触发。

【讨论】:

    【解决方案2】:

    为此有一个 jquery 移动小部件。这一直使用到版本 1.4

      $.mobile.loading( "show", { //show loading image
        text: "Your request is processing. please wait ...",
        textVisible: true,
        theme: "b",
        textonly: false,
      });
    

    求助Jquery Mobile Loader Widget

    【讨论】:

      【解决方案3】:

      正如 cmets 中所提到的。不过我更喜欢事件委托,而不是在整个 dom 中附加事件。

      // this is your original eventListener which prevents the default action (aka, navigating away)
      $('#random-link').click(function(event){
          event.preventDefault();
          $('#result').text('I was clicked from random-link event.')
      });
      
      // this would be the delegated listener. It wouldn't have to be all "a" tags 
      // that you respond to. It could be any css selector that causes the 
      // loading message that you want.
      $(window).on('click', 'a', function() {
         alert('I still bubble up.');
      });
      

      更新:

      也许你不应该为“链接”触发$('.jacket').show()

      $('.jacket').hide();
      
      $('a:not(.prevent)').click(function() {
          $('.jacket').show();
      });
      
      $('.prevent').click(function(event) {
          event.preventDefault();
          $('.jacket').hide();
      });
      

      【讨论】:

      • 邪恶的巴克,感谢上面的例子。我已经根据我的情况对其进行了修改。请查看已编辑的问题。
      • @Hitesh 我不确定我是否完全掌握你想要做的事情,但也许我更新的答案会有所帮助。
      • 邪恶的巴克,这就是我将要使用的。谢谢!
      【解决方案4】:

      我认为您想要实现的是基本的 AJAX 请求?但是你的做法是错误的。您可以改为使用 div 加载请求的页面,然后设置 ajax start 处理程序来显示您的加载消息。

      你的页面标记看起来像

      <nav>
        <button data-url="homeURL">Home</button>
        <button data-url="anotherURL">Other</button>
      </nav>
      <div id="loadhere"></div>
      

      生成的 jquery 会是这样的:

      //on button click
      $('nav button').click(function(){
        //set the url 
        url = $(this).attr('data-url');
          //load the page
          $('#loadhere').load(url);
      });
      
      //ajax start handler
      $(document).ajaxStart(function(){
        $('#loadhere').text('LOADING');
      });
      

      这是example codepen

      希望对你有帮助

      【讨论】:

      • 抱歉,我的问题中没有提到 AJAX。这是简单的页面导航。
      • 我意识到,它只是使用 AJAX 是一种更简单的方法来实现您的尝试,并且专为简单的页面导航而设计。无论如何,这是一个可能的跨浏览器解决方案......
      • @Hitesh 我个人认为这是最好的答案。如果我们发现我们的想法不能很好地实现,为什么不换一种方式思考
      • @Hitesh - 卢克的答案是最合适的答案(我投票赞成)......您正在尝试控制与您自己环境中的页面导航的交互(当您开始获得数据,然后在加载所有数据后隐藏它并显示页面)。这是使用 AJAX 解决方案的经典案例,因此您应该异步加载页面,这将解决您的问题。
      • 虽然这是一个很好的解决方案,但我接受了 Evil Buck 的回答,因为它更适合我的情况。感谢您的帮助,@lukeocom :)
      【解决方案5】:

      您可以在 body 元素中有一个 onLoad 函数,该函数调用加载 div 出现,然后 setTimeout 让我们说 3 秒,然后隐藏加载 div 并显示所有其他 div/body 的其余部分

      编辑: 我很确定这适用于所有浏览器。一旦我进入我的电脑(现在在我的手机上),我会附上一个代码 sn-p ;)

      【讨论】:

      • 实际上,一旦页面开始渲染,到达页面所花费的时间比加载整个 DOM 所花费的时间要长。因此,增加 3 秒的强制“加载”时间会不必要地使用户体验变慢。顺便说一句,是的,这适用于所有浏览器;)
      • 抱歉,不太确定您想要什么
      猜你喜欢
      • 1970-01-01
      • 2012-04-02
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 2014-12-28
      • 1970-01-01
      • 1970-01-01
      • 2011-12-28
      相关资源
      最近更新 更多