2017-06-14 67 views
0

我有一個簡單的小部件,並且希望將其加載到不同的站點上。我已閱讀this article並嘗試使用AJAX制定解決方案 - 將響應類型設置爲document從遠程站點加載html模板

首先看起來一切似乎確定 - 滑塊項目加載,樣式確定。但滑塊不開始滾動。似乎JavaScript不會開始運行。上/下按鈕也不起作用。

下面的代碼描述了我到目前爲止所嘗試的。

Widget - 我用樹枝做模板,但它並不重要。這會產生一個傳送帶/滑塊like this

<div class="slider-items-holder"> 
    <div class="control-btns"> 
     <ul><li><strong>Slider</strong></li> 
      <li><a href="javascript:void(0)" class="prev"></a></li> 
      <li><a href="javascript:void(0)" class="next"></a></li> 
     </ul> 
    </div> 
    <div class="content-wrapper"> 
     <ul> 
     {% for job in jobs %} 
      <li> 
       <div class="job-spotlight"> 
        <a href="{{ job.slug }}"><h4>{{ job.title }}<span class="job-type part-time">{{ job.type }}</span></h4></a> 
        <span><a target="_blank" href="{{ job.loc_statecode }}"> 
         <i class="marker"></i> {{ job.loc_state }}</a> 
        </span> 
        <span><i class="user"></i>{{ job.company }}</span> 
        <p>{{ job.detail|striptags }} ... </p> 
        <a href="{{ job.slug }}" class="button">Apply For This Job</a> 
       </div> 
      </li> 
     {% endfor %} 
     </ul> 
    </div> 
</div> 
<link rel="stylesheet" type="text/css" href="css/styles.css"> 
<script src="js/script.js"></script> 

JS

function fetch_jobs_widget(selector) { 
    var url = "http://localhost:9874"; 
    var t = "/static"; 
    var js_template = '<script type="text/javascript" src="'+url+'/js/script.js"></script>'; 
    var css_template = '<link rel="stylesheet" type="text/css" href="'+url+'/css/styles.css">' 
    var xhr = new XMLHttpRequest(); 
    xhr.open("GET", url+t, true); 

    xhr.responseType = 'document'; 
    xhr.onload = function(e) { 
    container(selector).innerHTML = ""; 
    var doc = e.target.response; 
    var widgetFragment = document.createDocumentFragment(); 

    widgetFragment.appendChild(doc.querySelector(".my-slider")); 

    container(selector).appendChild(widgetFragment); 
    container(selector).innerHTML += css_template; 
    container(selector).innerHTML += js_template; 

    } 

    xhr.send(); 
} 

HTML - 我想使用的小工具,網頁上。

<!DOCTYPE html> 
<html lang="en"> 
<head> 

</head> 
<body> 
<div class="textwidget jobs-plugin-carousel"> 
</div> 
<script type="text/javascript" src="widgets.js"></script> 
<script type="text/javascript">fetch_jobs_widget('.textwidget');</script> 
</body> 
</html> 

我也嘗試一次加載HTML/CSS/JS,但我已經用相同的結果出來了。

UPDATE

的滑塊JS代碼

//script.js 
(function() { 
     var mySlider, cWrapper, ul, li; 
     var current = 0; 
     var timeOut = 3000; 
     var intervalHandler; 
     var automaticStart = true; 

     init(); 

     function init() { 
      mySlider = document.querySelector(".my-slider"); 
      cWrapper = document.querySelector(".my-slider > .content-wrapper"); 
      ul = document.getElementById("slider-items-holder"); 
      li = ul.querySelectorAll("li"); 

      if (!mySlider || !cWrapper || !ul || !li.length) 
       return; 

      ul.style.width = cWrapper.offsetWidth * li.length; 
      ul.style.height = cWrapper.offsetHeight; 

      bindEvents(); 
      startSlider(); 
     } 

     function startSlider() { 
      if (automaticStart) 
       intervalHandler = setInterval(next, timeOut); 
     } 

     function next() { 
      if (current + 1 >= li.length) { 
       current = -1; 
      } 

      ul.style.marginLeft = '-' + (li[0].offsetWidth * ++current); 
     } 

     function prev() { 
      if (current - 1 < 0) { 
       current = li.length; 
      } 

      ul.style.marginLeft = '-' + (li[0].offsetWidth * --current); 
     } 

     function bindEvents() { 
      mySlider.addEventListener('mouseover', function() { 
       clearInterval(intervalHandler); 
      }); 

      mySlider.addEventListener('mouseout', startSlider); 

      var prevBtn = document.querySelector(".my-slider > .control-btns a.prev"); 
      var nextBtn = document.querySelector(".my-slider > .control-btns a.next"); 
      if (prevBtn) 
       prevBtn.addEventListener('click', prev); 

      if (nextBtn) 
       nextBtn.addEventListener('click', next); 
     } 
    })(); 
+0

哪個插件您使用的傳送帶/滑塊。它看起來像你的插件沒有正確初始化。當您的html添加到DOM時,您需要重新初始化它。 –

+0

無插件。 JSS一個自制的JavaScript - ))讓我用js和css代碼更新我的問題。 – marmeladze

+0

當你通過ajax加載你的html時,你需要調用你的插件的init()函數。因爲您的插件僅適用於第一次調用init()時在DOM中可用的元素。所以只需在添加新滑塊後再次調用init即可。 –

回答

1

當我看到你的滑塊密切,我發現你有這樣的行

ul = document.getElementById("slider-items-holder"); 

它試圖找到一個元素ID爲「slider-items-holder」,但在滑塊模板中,您的ul el沒有此ID EMENT。因此,將此ID添加到您的第二個ul元素。

編輯

你添加的JavaScript動態文件的方式是錯誤的。你需要你的腳本頭標記添加到您的html頁面類似這樣的

var myScript= document.createElement('script'); 
    myScript.type = 'text/javascript'; 
    myScript.src = 'http://localhost:9874/js/script.js'; 
(document.getElementsByTagName('head')[0]||document.getElementsByTagName('body')[0]).appendChild(myScript); 
+0

對不起,我後來更改了代碼。這不是問題。但讓我更新它。正如你在評論中寫的那樣,滑塊的javascript代碼不能識別新的dom元素 - 或者我的html不能識別新的dom元素。 – marmeladze

+0

你確定你的script.js文件加載完美。添加一個控制檯。登錄你的init()函數來檢查它是否被加載。或者你可以使用開發工具來檢查是否加載JavaScript文件。 –

+0

這是我的觀點。 當我檢查元素時,我可以看到'