2012-06-22 2 views
3

ВОПРОС: Каков правильный способ использования .get() в сочетании с .one() (или .live()), чтобы добавить внешний php-файл только один раз?Использование .one() с .get()

ПОСЛЕДНИЙ EDIT: решение

<script> 
$(document).ready(function(){ 
$('.tree li a').one("click", function() { 
    var currentAnchor = $('.tree li a').attr('href'); 
    if(!currentAnchor){ 
     var query = "page=1"; 
    } 
    else 
    { 
    var splits = currentAnchor.substring(1).split('&'); 
    //Get the section 
    var page = splits[0]; 
    delete splits[0]; 
    var query = "page=" + page; 
    alert ("page=" + page); 
    } 
    //Send the petition 
    $("#loading").show(); 
    $.get("callbacks.php",query, function(data){ 
     $("#content").append(data); 
     $("#loading").hide(); 
    });  
    return false; 
}); 
}); 
</script> 

Более конкретно:

Я использую Javascript и PHP, чтобы загрузить некоторые внешние PHP-страницы в виде разделов в моем главном шаблоне.

Я использую переключатель и добавляет(), поэтому включенные файлы сохраняются. Мне нужно, чтобы каждый файл был добавлен ТОЛЬКО ОДИН РАЗ. Вот сценарий, как хотелось бы, чтобы это произошло

1) загрузки нажата ссылка

2) downloads.php появляется

3) ошибки нажатия на ссылку

4) ошибки. PHP появляется ниже downloads.php

5) загрузок нажатия на ссылку снова

6) страница просто прокручивается до верхней downloads.php

Мне нужна такая же функциональность, как в примере на documentation page .one(), где каждый div можно щелкнуть только один раз.

Я также посмотрел Using .one() with .live() jQuery, и мне особенно понравился подход, используемый в принятом ответе.

Iried с использованием булевского флага, как предлагается ниже, но все, что он сделал, ограничивал мои последовательные клики по одной и той же ссылке на одну. Поэтому, если я нажму один link 1 несколько раз, он покажет страницу 1.php только один раз, но если я нажму ссылку 1, тогда ссылка 2, а затем ссылка 1 снова отобразит страницу 1.php, затем добавит страницу 2.php и добавит другая страница 1.php.

Я начинаю думать, что setInterval ошибочен, и я могу использовать .one() для всей функции checkAnchor() и привязать ее к тегам <a>. Я попытался это, но он не работает либо: (((

core.js - с помощью .one()

var currentAnchor = null; 
//$(document).ready(checkAnchor); 
//Function which chek if there are anchor changes, if there are, sends the ajax petition checkAnchor 
$("a").one("click", function(){ 
//Check if it has changes 
if(currentAnchor != document.location.hash){ 
    currentAnchor = document.location.hash; 
    //if there is not anchor, the loads the default section 
    if(!currentAnchor){ 
     query = "page=1"; 
    } 
    else 
    { 
     //Creates the string callback. This converts the url URL/#main&id=2 in URL/?section=main&id=2 
     var splits = currentAnchor.substring(1).split('&'); 
     //Get the section 
     var page = splits[0]; 
     delete splits[0]; 
     var query = "page=" + page; 

    } 
    alert ("hello"); 
    //Send the petition 
    $("#loading").show(); 

    $.get("callbacks.php",query, function(data){ 
     $("#content").append(data); 
     $("#loading").hide(); 
     }); 


} 
}); 

Другая вещь, которую я любил, как подход добавляет имена страниц массив, а затем проверку этого массива, чтобы убедиться, что страница еще не отображается. Мне удалось заполнить массив именами страниц, используя .push(), но я зашел в тупик, когда искал значение в нем. у вас есть идея, как это должно выглядеть так, что было бы очень полезно.

core.js

///On load page 
var contentLoaded; 
$().ready(function(){ 
contentLoaded = false; 
setInterval("checkAnchor()", 300); 
    alert (contentLoaded); 
}); 
var currentAnchor = null; 

//Function which chek if there are anchor changes, if there are, sends the ajax petition 
function checkAnchor(){ 
//Check if it has changes 
if(currentAnchor != document.location.hash){ 
    currentAnchor = document.location.hash; 
    //if there is not anchor, the loads the default section 
    if(!currentAnchor){ 
     query = "page=1"; 
    } 
    else 
    { 
     //Creates the string callback. This converts the url URL/#main&id=2 in URL/?section=main&id=2 
     var splits = currentAnchor.substring(1).split('&'); 
     //Get the section 
     var page = splits[0]; 
     delete splits[0]; 
     var query = "page=" + page; 

    } 
    alert ("hello"); 
    //Send the petition 
    $("#loading").show(); 

    alert (contentLoaded); 

    if (!contentLoaded){ 
    $.get("callbacks.php",query, function(data){ 
     $("#content").append(data); 
     $("#loading").hide(); 
     }); 

     alert (contentLoaded); 

    } 
    contentLoaded = true; 


} 
} 

вот мой

обратных вызовов.PHP

<?php 
//Captures the petition and load the suitable section 
switch($_GET['page']){ 
case "4100errors" : 
    include 'template/4100errors.php'; 
    break; 
case "4100downloads" :  
include 'template/4100downloads.php'; 
    break; 
} 
?> 

И мой главный файл

4100.php

<?php 
include 'template/header.php'; 
include 'template/4100menu.php'; 
include 'template/log.php'; 
include 'template/links.php'; 
include 'template/4100breadcrumbs.php'; 
?> 
<div class="left-widget"> 
<div style="display:none; position:absolute; top:-9999; z-index:-100;"> 
<a href="4100.php?page=4100downloads"></a> 
<a href="4100.php?page=4100errors"></a> 
</div> 

<div id="side-nav-bar" class="Mwidget"> 
    <h3>Contents</h3> 
     <ul class="tree"> 
      <li><a href="#4100downloads" class="links" >Downloads</a>  </li> 
      <li><a href="#4100errors" class="links">Error Troubleshooting</a></li> 
     </ul> 
    </div> 
    </div> 

    <div id="content" style="margin-top:100px; margin-left:300px;"> 
    <? 
switch ($_GET['page']) 
{ 
case "4100downloads": include 'template/4100downloads.php'; break; 
case "4100errors": include 'template/4100errors.php'; break; 


} 
?> 

</div> 

</body> 
</html> 

4100dowloads.php

Downloads test page 

4100error.php

Errors test page 

Также вы можете посмотреть на тестовой странице здесь http://period3designs.com/phptest/1/4100.php

+4

Не могли бы вы пояснить, что конкретно задается здесь? –

+0

Посмотрите на обновление выше. Я искренне надеюсь, что это станет более ясным. –

ответ

3

«Что такое правильный способ использовать .get() в сочетании с .one() (или .live()), чтобы внешний php-файл был добавлен только один раз? "

.one() и live() действительно имеют мало общего с $.get. Они предназначены только для обработки событий.

Если вы собираетесь запускать код каждый 50ms, как вы, но хотите заменить текущее содержимое, а затем использовать .html() вместо .append().

$("#content").html(data); 

Это перепишет старый контент.


Я полагаю, вы знаете об этом, но просто чтобы быть уверенным, что ваш код работает на интервале из-за этого ...

$().ready(function(){ 
    setInterval("checkAnchor()", 50); // better--> setInterval(checkAnchor, 50); 
}); 

Если вы хотите только один раз в документе нагрузки, затем сделайте это ...

$(document).ready(checkAnchor); 
+0

Я попытался запустить его один раз, когда документ готов, но он действует точно так, как я ожидал, - он запускает его один раз, а затем никогда не проверяет якорь, который обновляется без перезагрузки страницы. Я закончил тем, что прокомментировал это и перешел на маршрут .one(). Спасибо, что указали на интервал. Это определенно в пути.И снова, чтобы уточнить, я хочу добавить каждую страницу только один раз, а не заменять один на другой. –

+0

Я обновил полный ответ на мой вопрос выше :) –

2

Просто используйте булевский флаг, чтобы определить, загружены ли данные или нет. Установите для него значение false при загрузке страницы, а сразу после вызова $.get установите значение true. Затем заверните $.get с помощью if (!contentLoaded) { $.get ... }.

Таким образом, вы будете выполнять $.get только один раз.

BTW: $.one Используется для привязки события к элементу, который будет выполняться только один раз, а затем отвязать его от него.

+0

черт возьми, они вышвырнут меня из офиса, потому что уже слишком поздно, но это имеет большой смысл! Я верю в час или около того, когда я доберусь до своего домашнего компьютера, я смогу заставить его работать. Большое спасибо! –

+0

@RenoDimitrova: не проблема, дайте мне знать, как это произошло, когда вы попробовали. Удачи! –

+0

ОК, так жаль за задержку, но мой мозг отказывается работать для меня больше. В любом случае, проверьте обновленный код. Я попробовал то, что вы сказали, но я думаю, что проблема связана с постоянным запуском 'checkAnchor()' .Or. Я не вижу здесь, очевидно, что неправильно. Я начинаю смотреть на другие параметры ... –

Смежные вопросы