代码之家  ›  专栏  ›  技术社区  ›  ItFreak

HTML锚发送请求,但不跟随链接

  •  0
  • ItFreak  · 技术社区  · 7 年前

    我遇到了这样一种情况,我有一个链接,可以将数据发送到后端控制器,它看起来是这样的:
    http://url/backend/index.php?controller=someController&update=2&name="Test" 这个控制器对传输的数据执行一些操作并返回一个HTML视图。但是,我有一个特殊的用例,在这里我想触发数据处理,而不遵循重定向到发送的HTML响应。
    有没有办法运行请求并触发控制器处理数据并保持在同一页上/不“跟随”链接?我想用 event.preventDefault()

    4 回复  |  直到 7 年前
        1
  •  1
  •   user10243107 user10243107    7 年前

    你可以打电话事件.preventDefault(),并通过事件侦听器中的AJAX(XMLHttpRequest)发出请求。

        2
  •  1
  •   sadq3377    7 年前

    如果这是你的原始代码:

    <a href="http://url/backend/index.php?controller=someController&update=2&name=Test">Test Link</a>
    

    你应该这样做:

    <a onclick="sendRequest">Test Link</a>
    
    <script>
    
    function sendRequest(){
    
        var xhr = new XMLHttpRequest();
    
        xhr.open('GET', 'http://url/backend/index.php?controller=someController&update=2&name=Test');
    
        xhr.send();
    
    }
    
    </script>
    
        3
  •  1
  •   Delmarc Eric Rosario    7 年前

    有点像@sadq3377所说的。。。但是让我们以一种不引人注目的方式来做这件事。。。

    <a id="some-link" href="http://url/backend/index.php?controller=someController&update=2&name='Test'"">Some link</a>
    

    然后你可以像下面这样做一些JavaScript

    document.getElementById('some-link').addEventListener('click', function(ev){
        ev.preventDefault();
        // DO SOMETHING WITH THE HREF like use it for the ajax call
        var ajaxCall = new XMLHttpRequest();
        ajaxCall.open('GET', this.href);
        ajaxCall.send();    
    });
    

    所以至少你的代码中没有任何硬编码项。。。


    为了让它更具可扩展性,@ItFreak要求你可以这样做。。。

    window.addEventListener('click', function(ev){
        if( ev.target.getAttribute('data-ajax-link') !== null ){
            ev.preventDefault();
            // DO THE REST OF THE CODE FROM THE PREVIOUS EXAMPLE
        }
    });
    

    <a id="some-link" data-ajax-link href="http://url/backend/index.php?controller=someController&update=2&name='Test'"">Some link</a>
    

    任何具有'dataajaxlink'属性的链接都将通过这个if语句并使用这个逻辑,其他所有链接都将像普通链接一样运行。。。

        4
  •  0
  •   AndrewSteinheiser    7 年前

    window.open(url,'_blank');