6

我在本地 apache/test实例/test/infojQuery.ajaxiOS模拟器,没有调用,页面刷新。

window.getInfo = function ( event ) {
  console.log('1) prior to $.ajax');
  $.ajax({
    url: 'http://localhost/test/info',
    dataType: 'html',
    beforeSend: function(xhr) { 
      console.log('2) beforeSend'); 
    },
    success: function(data, textStatus) {
      console.log('3) success');
      if ( textStatus == 'success' ) {
        // doing stuff with data
      }
    }
  }).always( function() { console.log('4) always'); });
};

从桌面浏览器打印所有日志,并且我的 apache 服务器报告了一个请求/test,但在 iOS 模拟器中的 Safari 上,只打印了'1) prior to $.ajax''2) beforeSend'日志,并且对 apache 发出的下一个请求是 for /test

有谁知道这里发生了什么,以及如何让 iOS 正常运行?

更新:当我将async: false属性添加到ajax调用时,所有日志都被打印出来,并发出请求,这样基本上就解决了这个问题;但是页面仍然会重新加载,我认为这是与 iOS 上的事件传播相关的另一个问题。

4

1 回答 1

6

完成这项工作所需的只是return false;来自处理程序函数。请参阅event.preventDefault() vs. return false以获得更完整的解释,但基本上“return false在 jQuery 事件处理程序中与在传递的 jQuery.Event 对象上调用 e.preventDefault 和 e.stopPropagation 相同。”

因此,上述代码的全功能版本是:

getInfo = function() {
  $.ajax({
    url: '/test/info',
    dataType: 'html',
    success: function(data, textStatus) {
      if ( textStatus == 'success' ) {
        // doing stuff with data
      }
    }
  });
  return false;
};

// The order of vv that string may be important
$(document).on('click touchend', '.getInfo', getInfo );
于 2013-07-16T22:44:38.443 回答