javascript - 当用户停止写入时发送 XMLHttpRequest

标签 javascript

我只想在用户停止写入时发送请求...我似乎已经通过 (str.length > 3) 停止了额外的垃圾邮件。但我需要的是当用户停止编写此脚本时获取输入值并将其转发。

这是现在更新的代码。

function debounce(func, wait, immediate) {
    var timeout;
    return function() {
        var context = this, args = arguments;
        var later = function() {
            timeout = null;
            if (!immediate) func.apply(context, args);
        };
        var callNow = immediate && !timeout;
        clearTimeout(timeout);
        timeout = setTimeout(later, wait);
        if (callNow) func.apply(context, args);
    };
};


var server = window.location.hostname;
var pathname = window.location.href.split('/');
pathname = (pathname[3]);
var myEfficientFn = debounce(function() {
function showHint(str) {
    if (str.length === 0) { 
        document.getElementById("search-search"suggest-home").innerHTML = "";
    } if (str.length > 3)  {
        var xmlhttp = new XMLHttpRequest();
        xmlhttp.onreadystatechange = function() {
            if (this.readyState == 4 && this.status == 200) {
               // this.responseText;
                var repox = JSON.parse(this.responseText);
                var wrapper = document.getElementById("search-search"suggest-home");
                var myhtml = '<ul>';'<ul style="margin-bottom: 0;min-width: 296px;">';
                for (var i = 0; i < repox.length; i++) {
                var repo = repox[i];
                console.log(repo.url);
                if(repo.type == "breakJios12""ios11"){
                myhtml += '<p>'+ repo.2212+'</p>';"<li>";

                }
                if(repo.type == "breakJios11""ios"){
                myhtml += '<p>'+ repo.2213+'</p>';"<li>";
                }
                }
                myhtml += '<li class="ss-bottom" style="padding: 0; border-bottom: none;"><a href="https://'+  server +'/?s='+encodeURIComponent(str).replace('%20','+')+'" id="suggest-all">View all</a></li>';

                wrapper.innerHTML = myhtml;
            }else {
    // Check back again 1 sec later
    setTimeout(checkState, 1000);
  }
        };
        xmlhttp.open("GET", "https://"+ server +"/test/"+str, true);
        xmlhttp.send();


    }
}
window.onload = showHint(str);
}, 250);
window.addEventListener('resize', myEfficientFn);

编辑感谢@Emilel Zuurbier代码现在可以运行

最佳答案

很高兴您添加了去抖动功能,尽管它需要一些修改。我将尝试解释您应该如何使用它以及代码中会发生什么。

function debounce(func, wait, immediate) {
    var timeout;
    return function() {
        var context = this, args = arguments;
        var later = function() {
            timeout = null;
            if (!immediate) func.apply(context, args);
        };
        var callNow = immediate && !timeout;
        clearTimeout(timeout);
        timeout = setTimeout(later, wait);
        if (callNow) func.apply(context, args);
    };
};

创建一个用于处理 onkeyup 事件的函数。在您的情况下,它是 showHint 函数。将参数 event 替换为参数 str,该参数将是由 onkeyup 事件创建的 Event 对象。

function showHint(event) {
    var content = event.target.value;
    // do something with the content
}

现在创建 showHint 函数的去抖版本。
debounce 函数返回另一个函数,该函数将在用户停止按键后 250 毫秒执行 showHint 函数。这一切都与closures有关.

var debounceShowHint = debounce(showHint, 250);

debounceShowHint 绑定(bind)到 onkeyup 事件属性,并为其提供 event 参数,该参数将传递给您的 showHint 函数。

<input onkeyup="debounceShowHint(event)">

关于javascript - 当用户停止写入时发送 XMLHttpRequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59471167/

相关文章:

javascript - 如何 POST 一个包含对象数组的数组?

javascript/jquery 选择行中的最后一个元素

javascript - 如果用户在其中粘贴整个文本或字符串,如何检测文本输入区域中的粘贴?

javascript - 信用卡验证无法在 Wordpress 中运行

javascript - 如何使用 React.createElement() 测试在 Render 中创建的子 React 组件

JavaScript 从另一个对象更新对象值

javascript - jQuery 滑动一个 div

Javascript - 轮播到达右端或左端

javascript - React.js 不会在 setState 上重新渲染

javascript - 在magento主页上显示多类别产品