当用户触摸任何不是't链接/锚等

How to perform some action when a user touches anywhere that isn't a link/anchor etc?

本文关键字:链接 锚等 用户 触摸 任何不      更新时间:2023-09-26

我在iOS和UIWebView中使用html/javascript。当用户触摸页面上任何不是链接的地方时,我想调用objective-c方法。

目前我有

...
<BODY ontouchend="bodyTouch();">
<HEAD>
    <script language="javascript" type="text/javascript">
        function bodyTouch() {
            invokeObjectiveC();
            }
        }
     </script> 
...
<DIV id=buttons>
<A id=navigator href="CustomScheme:SomeAction"></A>
....

我该如何设置,以便只有当用户触摸屏幕上不是链接/按钮/锚等的任何地方时,bodyTouch()才会被调用。

===更新===

谢谢大家的回答。不幸的是,我无法让它们中的任何一个工作(现在,当我尝试其中任何一个时,我的InvokeObjectiveC()根本不会被调用)。我是一名iOS开发人员,不懂html/javascript。我会做一些研究,因为我目前用有限的知识不理解任何答案,然后在理解他们在做什么后尝试,并试图找出为什么不起作用。我会在适当的时候把其中一个答案标记为已接受。干杯

document.body.addEventListener('click', function(event){
   bodyClick();
}, false);
document.querySelector('a').addEventListener('click', function(event){
    event.stopPropagation();
}, false);

​在Mozilla开发者网络上了解有关stopPropagation的更多信息

JSFiddle

试试这个,你应该可以把它放在文档的任何地方

<script>
document.addEventListener('DOMContentLoaded', function () {
 document.documentElement.addEventListener('click', function (e) {
  /* CHECK IF THE TARGET IS IN YOUR BANLIST */
  if (['A', 'BUTTON'].indexOf(e.target.tagName) === -1) {
   /* I WOULD CALL THESE FOR GOOD MEASURE */
   e.preventDefault();
   e.stopPropagation();
   /* THIS IS YOUR FUNCTION */
   invokeObjectiveC();
  }
 }, true);
}, false);
</script>

这对看起来像输入[type=button]的按钮不起作用,如果你需要的话,也让我知道

使用jQuery委托和选择器,但是,如果该事件的原始元素触发使用stopPropagation

,请小心

类似于Roderick的响应,但更适合跨浏览器

document.getElementsByTagName('html')[0].addEventListener('click', function (ev) {
    var el, elN;
    ev = ev || window.event;
    el = ev.target || ev.srcElement;
    elN = el.nodeName.toLowerCase();
    if (elN == 'a' || elN == 'input') return false;
    invokeObjectiveC();
}, true);