onclick事件在iphone混合应用程序中发生两次

时间:2012-10-23 12:15:29

标签: javascript iphone javascript-events

我正在开发iPhone混合应用程序。我已经使用javascript插入了一个链接,并定义了应该在“onclick”事件中调用的函数。

当我点击链接时,调用了函数并执行了所需的操作,但之后如果我单击应用程序正文中的任何位置,则会再次调用相同的函数。

这适用于我的应用程序中的两个链接。

有人能说出发生了什么错误吗?

我编写了一个将图像添加为链接的功能。代码如下。

// create a link for delete enquiry
var DelLink = document.createElement("a");

// setting the name of the link.
DelLink.setAttribute("name" , "DelButton"+pCurrentEnquiryID);

// image for the delete and its properties.
var DelImage = document.createElement("img");
DelImage.setAttribute("src","images/delete.png");
DelImage.setAttribute("height","30px");
DelImage.setAttribute("width","30px");

// append image to the link
DelLink.appendChild(DelImage);

//specifying onclick event of the link
DelLink.setAttribute("onclick","DeleteEnquiry(this)");
//DelLink.onclick = "DeleteEnquiry(this)";

return DelLink;

1 个答案:

答案 0 :(得分:2)

好的,所以你要设置onclick属性。现在,这在“传统”平台上非常有效(它具有类似鼠标的设备,其中的按钮可用于单击对象)。触摸设备(名称中的线索)没有这个,而是通过触摸屏幕来操作。好吧,你知道的,所以我认为你可以理解touch事件非常超载(多点触控)。

触摸屏幕一秒意味着与触摸屏幕一瞬间完全不同。您也可以用1,2,3或4个手指触摸屏幕。每次都要以不同的方式处理。
为了使事情变得更加复杂,你可以在屏幕上拖动滑动,这也需要以不同的方式处理。

幸运的是,我最近编写了一些代码来将某些触摸事件映射到点击处理程序,使用闭包,绑定侦听器以及设置各地的超时。所以这可能会帮助你:

if ('ontouchstart' in window)
{//we have a touch device
    document.body.addEventListener('touchstart',function(e)
    {//handle all touch events on the body
        e = e || window.event;
        //not sure about all mobile browsers (win mobile)
        //so I'm playing it safe
        var target = e.target || e.srcElement;
        if (target.tagName.toLowerCase() !== 'a')
        {//didn't touch on a link
            return e;//stop
        }
        //touch must end after .3 seconds, otherwise user is zooming or something
        var timer = setTimeout(function()
        {
            target.removeEventListener('touchend',endHandler,false);//unbind after .3 seconds
            clearTimeout(timer);
        },300);
        var endHandler = function(e)
        {
            e = e || window.event;
            var endTarget = e.target || e.srcElement;//get element on which the touch ended
            clearTimeout(timer);//stop timer
            target.removeEventListener('touchend',endHandler,false);//remove listener
            if (endTarget !== target)
            {//user "swiped"
                return e;
            }
            //touch ended within .3 seconds, and ended on the same element, interpret this as click
            return clickHandlerFunction.apply(target,[e]);//invoke click handler with the target as context
        };
        target.addEventListener('touchend',endHandler,false);//bind touchend listener
    },false);
}

这基本上是注册所有 touchstart事件。正在检查的第一件事是用户触摸了感兴趣的元素,我想用自定义事件处理程序处理它。如果没有,则返回事件,没有任何变化。
如果感兴趣的是元素接触,我会为该目标上的touchend事件创建一个监听器。我还设置了一个超时,它将在.3秒后删除该侦听器(以防止泄漏)。如果touchend事件触发,请检查用户是否在原始元素上被释放,如果没有,则将其解释为滑动,然后停止。
如果目标匹配,则调用目标中的点击处理程序上下文和传递事件对象!,以便您可以调用stopPropagation()和/或preventDefault()方法。 touchhandler也可以通过清除计时器并自行删除(再次:防止内存泄漏)。
与以往一样,这是一个非常非常基本的代码片段,可以完成更多的工作

触摸事件包含更多信息(例如,您可以检查触摸屏幕的手指数量)。我省略了一些我的原始代码,因为这会使它非常复杂而且凌乱(我在这里没有它,我真的不记得我是如何处理的某些情况)。但是,我可以告诉您,我倾向于检查e.clientXe.clientY坐标,如果touchend事件在touchstart目标的50px范围内,我会将其映射到无论如何,点击处理程序:为寒冷和颤抖的人提供一些软焦点;)所以即使是因纽特人也可以浏览页面。

无论如何,看看什么对你有用。但有几个有用的链接:
Touch table
some history
some touch libs