【问题标题】:Javascript slider not working when using AJAX to open up the page使用 AJAX 打开页面时 Javascript 滑块不起作用
【发布时间】:2017-03-29 12:32:36
【问题描述】:

我正在尝试通过单击按钮使用 ajax 打开 HTML 页面。

我打开的 HTML 页面中有一个 javascript 滑块,如果我自己打开页面,它可以正常工作,但是如果我通过 ajax 使用 index.html 打开它,滑块就会停止工作。

我把这两个页面的代码都放给你看:

index.html(使用ajax打开“SayHello.html”)代码如下:

    <script language="JavaScript" type="text/javascript">
        //Gets the browser specific XmlHttpRequest Object
        function getXmlHttpRequestObject() {
            if (window.XMLHttpRequest) {
                return new XMLHttpRequest(); //Not IE
            } else if(window.ActiveXObject) {
                return new ActiveXObject("Microsoft.XMLHTTP"); //IE
            } else {
                //Display your error message here. 
                alert("Your browser doesn't support the XmlHttpRequest object.  Better upgrade.");
            }
        }           
        //Get our browser specific XmlHttpRequest object.
        var receiveReq = getXmlHttpRequestObject();     
        //Initiate the asyncronous request.
        function sayHello(x) {

            //If our XmlHttpRequest object is not in the middle of a request, start the new asyncronous call.
            if (receiveReq.readyState == 4 || receiveReq.readyState == 0) {
                //Setup the connection as a GET call to SayHello.html.
                //True explicity sets the request to asyncronous (default).
                if(x==3)
                    receiveReq.open("GET", 'SayHello.html', true);
                else if(x==4)
                    receiveReq.open("GET", 'SayHello2.html', true);             
                //Set the function that will be called when the XmlHttpRequest objects state changes.
                receiveReq.onreadystatechange = handleSayHello; 
                //Make the actual request.
                receiveReq.send(null);
            }           
        }
        //Called every time our XmlHttpRequest objects state changes.
        function handleSayHello() {
            //Check to see if the XmlHttpRequests state is finished.
            if (receiveReq.readyState == 4) {
                //Set the contents of our span element to the result of the asyncronous call.
                document.getElementById('span_result').innerHTML = receiveReq.responseText;
            }
        }
    </script>
<table class="nav">
      <tr><th>sd</th></tr>
      <tr><td><a href="javascript:sayHello(3);">Say Hello</a></td></tr>
      <tr><td><a href="javascript:sayHello(4);">Turvey, Kevin</a></</td></tr>
      <tr><td>Mbogo, Arnold</td></tr>
      <tr><td>Shakespeare, Bill</td></tr>     
    </table>
    <br /><br />

    <span id="span_result"></span>

SayHello.html 代码如下:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<!-- Mirrored from woorktuts.110mb.com/art_of_reuse_code/index4.html by HTTrack Website Copier/3.x [XR&CO'2010], Tue, 14 Feb 2012 15:07:17 GMT -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Horizontal Carousel</title>
<script type="text/javascript" src="mootools.svn.js"></script>
<script type="text/javascript">
window.addEvent('domready', function(){ 
      var totIncrement      = 0;
      var increment         = 212;
      var maxRightIncrement = increment*(-6);
      var fx = new Fx.Style('slider-list', 'margin-left', {
                duration: 1000,
                transition: Fx.Transitions.Back.easeInOut,
                wait: true
       });

       //-------------------------------------
      // EVENTS for the button "previous"
      $('previous').addEvents({ 
          'click' : function(event){ 
          if(totIncrement<0){
                    totIncrement = totIncrement+increment;
                    fx.stop()
                    fx.start(totIncrement);
                }
            }                 
      }); 

       //-------------------------------------
      // EVENTS for the button "next"
      $('next').addEvents({ 
          'click' : function(event){ 
             if(totIncrement>maxRightIncrement){
                 totIncrement = totIncrement-increment;
                fx.stop()
                fx.start(totIncrement);
            }
          }               
      })


});
    </script>


<style type="text/css">
    body{
        font-family:"Lucida Grande", "Lucida Sans Unicode", Verdana, Arial, Helvetica, sans-serif; font-size:11px; color:#333333;
        background-color:#FFFFFF;
    }
    a:link, a:visited, a:hover{color:#0066CC; text-decoration:none;}
    #slider-stage{width:632px; overflow:auto; overflow-x:hidden; overflow-y:hidden; height:200px; margin:0 auto;}
    #slider-buttons{width:632px; margin:0 auto;}
    #slider-list{width:2000px; border:0; margin:0; padding:0; left:400px;}
    #slider-list li{
        list-style:none; 
        margin:0; 
        padding:0; 
        border:0; 
        margin-right:4px;
        padding:4px; 
        background:#DEDEDE;
        float:left;
        width:200px;
        height:200px;
        }
</style>
</head>

<body>
<h3>More tutorial here: <a href="http://woork.blogspot.com/">http://woork.blogspot.com</a></h3>
<p>Click on Previous or Next Button </p>
<div id="slider-stage">
<ul id="slider-list">
    <li id="l1">Box 1</li>
    <li id="l2">Box 2</li>
    <li id="l3">Box 3</li>
    <li id="l4">Box 4</li>
    <li id="l5">Box 5</li>
    <li id="l6">Box 6</li>
    <li id="l7">Box 7</li>
    <li id="l8">Box 8</li>
    <li id="l9">Box 9</li>
    <li id="l10">Box 10</li>
</ul>
</div>
<div id="slider-buttons">
<a href="#" id="previous">Previous</a> | <a href="#" id="next">Next</a>
</div>
</body>

<!-- Mirrored from woorktuts.110mb.com/art_of_reuse_code/index4.html by HTTrack Website Copier/3.x [XR&CO'2010], Tue, 14 Feb 2012 15:07:20 GMT -->
</html>
<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "ht$
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga$
</script>
<script type="text/javascript">
try {
var pageTracker = _gat._getTracker("UA-1497692-16");
pageTracker._trackPageview();
} catch(err) {}</script>

请帮忙。

问候 泽山

【问题讨论】:

标签: javascript ajax mootools slider


【解决方案1】:

通过 AJAX 加载的 Javascript 无法执行。您需要将绑定所有事件的代码移动到handleSayHello 函数。这适用于您的domready 事件以及previousnext 点击事件。

【讨论】:

  • 实际上,mootools 可以通过您传递给请求类的evalSCriptsevalResponse 选项导入脚本。虽然它不会启动 domready 事件,但不会。
【解决方案2】:

您可以将幻灯片代码更改为在如下函数中:

function startSlideshow() {
    // code for slideshow without domready event here
}

在 domready 中调用它(如果需要)并在每次加载内容时调用它。

//...
document.getElementById('span_result').innerHTML = receiveReq.responseText;
startSlideshow();
//...

【讨论】:

    【解决方案3】:

    问题是,由于您正在使用 ajax 加载 "SayHello.html",因此您在其中的 javascript 代码不会被执行。

    所以保持"SayHello.html" 只包含html,并且在你更改" index.html" 中的.innerHTML 之后,调用一个函数来做任何你想做的事情,它也应该位于"index.html"

    【讨论】:

      【解决方案4】:

      我遇到了类似的问题,用.ajaxComplete() 方法解决了。所以:

      $(document).ajaxComplete(function(){
          //do something
      
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-22
        • 1970-01-01
        • 2022-01-18
        • 2016-11-24
        相关资源
        最近更新 更多