繁体   English   中英

暂停JavaScript功能onclick

[英]Pause JavaScript function onclick

嗨,我是JavaScript和AJAX的新手。

这个页面的想法是,当用户点击地图中图像中的相应区域时,当'field_X'中的条目为'0'时,它调用JavaScript函数myFunction1 - 此函数然后将'field_X'更新为'1'通过AJAX('field_X'以'0'条目开头)。

然后,当用户下次点击地图中的相同区域时,调用myFunction2 ,因为'field_X'中的条目现在为'1' - 然后将'field_X'更新为'2'。

等等...

AJAX调用工作正常,并在单独调用适当的函数时正确更新'field_X'。

然而问题是(使用我的代码)当用户点击地图时,所有3个函数都会被连续调用(并且'field_X'变为'3')。 我不确定如何在函数之间暂停这个并等待用户的下一次单击。

我尽可能地将函数中的代码缩写为函数,因为函数也执行其他操作。 任何帮助,将不胜感激。

PHP用户页面

<?php function request_data(){select field_X from TABLE_X; }  
$q = request_data(); ?>  

<map>  
<area onclick= <?php    
    if ($q == '0') {?>"myFunction1();" <?php }  
    if ($q == '1') {?>"myFunction2();" <?php }  
    if ($q == '2') {?>"myFunction3();" <?php }   
    if ($q == '3') { ...and so on... }   
?> />  
</map>  

JavaScript页面

<script>   
//JavaScript  
function myFunction1() { update_1(); }  
function myFunction2() { update_2(); }  
function myFunction3() { update_3(); }  

//AJAX - abbreviated  
function update_1(){ update TABLE_X set field_X = (1); }  
function update_2(){ update TABLE_X set field_X = (2); }  
function update_3(){ update TABLE_X set field_X = (3); }  
</script>   

你不能暂停JS的执行,而不是真的...有一些hacky方法可以做到这一点,但它们会产生可怕的代码,所以学习它们真的没有意义。 我会像评论中的一些人所建议的那样使用全局(甚至更好的:闭包)变量。 这是我将在您的案例中使用的基本设置:

//server side, instead of echoing function1() etc...
echo 'var funcNumber = ';
switch($q)
{
    case 0: echo 1; break;
    case 1: echo 2; break;
    //and so on
}
echo ';';
//or better yet
echo 'var funcNumber  = '.($q + 1).';';

然后,在JS中

//var funcNmber = 1; ===> makes it a global var, which is not recommended
window.onload = function()
{
    var funcNmber = 1;//echo here if possible
    var handler = function(e)
    {//assign to var, you'll see why
        var ajax = nex XMLHttpRequest(),
        that = this, //this points to the clicked element, reference it by var that
        queryString = 'field=' + funcNumber;
        //your basic setup
        //followed by this piece of magic:
        this.onclick = null;//unbind handler
        ajax.onreadystatechange = function()
        {
            if (this.readyState === 4 && this.status === 200)
            {//call complete
                funcNumber++;//increment
                that.onclick = handler;//rebind event handler, that's why we named it
            }
        };
    };
    document.getElementById('areaId').onclick = handler;//bind handler
};

当然,这段代码还需要做很多工作。 如果您想要X-browser XHTTP对象,例如:

var getXHR = function()
{
    try
    {
        return new XMLHttpRequest();
    }
    catch (error)
    {
        try
        {
            return new ActiveXObject('Msxml2.XMLHTTP');
        }
        catch(error)
        {
            try
            {
                return new ActiveXObject('Microsoft.XMLHTTP');
            }
            catch(error)
            {
                throw new Error('no Ajax support?');
            }
        }
    }
};

此外,由于我们使用的是X浏览器,请注意window.onload可能会导致内存泄漏,如果您了解事件委派和闭包的工作方式, 这很容易避免 既然你对JS比较陌生,我怀疑你可能想读一下......这是值得的!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM