Двойной удаленный вызов с плагином jQuery Address и удаленными ссылками Rails 3 - PullRequest
2 голосов
/ 10 октября 2011

Я использую этот плагин jQueryhttp://www.asual.com/jquery/address/потому что у меня есть полный ajax-сайт, взломанный в Rails 3.1.0, но мои действия / методы также отвечают на запросы html.

, поэтому, если у меня есть ссылка

<%=link_to "my link",{:controller=>"my_controller",:action=>"my_action"},:remote=>true%>

, это сделает вызовно URL останется прежним, и если я поделюсь URL, вы всегда будете просматривать страницу корневой страницы /, но с помощью этого плагина я получу возможность вызывать удаленный метод my_controller, а также изменить отображаемый URL с помощью

var elemetns = $("a.addressPlugin");
 $.address.crawlable(1).state('/').init(function(){
    elemetns.address();
 });

моя новая ссылка

<%=link_to "my link",{:controller=>"my_controller",:action=>"my_action"},:class=>"addressPlugin",:remote=>true%>

теперь мой URL выглядит как

http://localhost:3000/my_controller/my_action

, но когда я нажимаю на браузер, страница остается без изменений

тогда я решил сделать это

var elemetns = $("a.addressPlugin");
 $.address.crawlable(1).state('/').init(function(){
    elemetns.address();
 }).change(function(e){
        $.ajax({type:'GET',url:e.path,dataType:'script',cache:true});
 });

, так что теперь он делает трюк назад и вперед, но ....

когда я нажимаю на ссылку, она делает удаленныйвызовите дважды .... один раз для самой ссылки и один для метода .change(... .... но когда я возвращаюсь назад, он работает отлично, он выполняет вызов только один раз для метода .change(... .... так что

Как я могу предотвратить вызов $.ajax только при переходе назад и вперед в браузере, а не приn переходя по ссылкам, потому что они уже звонили сами?

<< - ОБНОВЛЕНИЕ - >>В браузерах Safari и Chrome, когда я вхожу в историю на шаг назад от своей главной страницы, а затем перемещаюсь вперед с помощью кнопок браузера, я получаю полный белый экран, отображающий только функцию javascript, которая загружает мой main/index вид через ajax, но есть тольков браузере

Javascript Function Displaying instead of webpage

<< - ОБНОВЛЕНИЕ ->

В основном это то, что я пытаюсь воспроизвести, но использую рубин на рельсах и их remote links

http://www.asual.com/jquery/address/samples/state/

Ответы [ 3 ]

0 голосов
/ 25 октября 2011

Почему вы используете связыватель событий .change?Попробуйте вместо этого использовать связыватель событий .click.Кроме того, сделайте это return false;, чтобы предотвратить действие по умолчанию.

var elemetns = $("a.addressPlugin");
$.address.crawlable(1).state('/').init(function(){
    elemetns.address();
}).click(function(e){
    $.ajax({type:'GET',url:e.path,dataType:'script',cache:true});
    return false;
});
0 голосов
/ 25 октября 2011

Я хотел бы, чтобы ссылки выполняли обработчик событий, который проверял бы глобальный флаг.Затем в событии change адреса я проверял бы этот флаг и выполнял действие, только если он не установлен.

Например:

var throughNormalLink = false;

$.address.crawlable(1).state('/').init(function(){
    elemetns.address();
}).change(function(e){
    if(!throughNormalLink)
        $.ajax({type:'GET',url:e.path,dataType:'script',cache:true});
    else // Update: reset the flag
        throughNormalLink = false;
});

$("a").click(function() {throughNormalLink = true; .../* the rest of your code */});
0 голосов
/ 24 октября 2011

Один из способов сохранить правильную работу кнопки «Назад» в одностраничном интерфейсе - использовать хеш в URL.Twitter - это сайт, который делает это.

Хэш сообщает браузеру, что мы просто переходим к привязке на текущей странице, поэтому страница не перезагружается, но URL добавляется в историю браузера.Это означает, что если вы правильно обрабатываете URL с помощью Javascript и загружаете содержимое, которое хотите, основываясь на фрагменте URL (часть после хэша), то кнопка «Назад» все равно должна работать нормально.

Я не могу датьВы конкретно указываете, как именно интегрировать это в свое приложение, но если вы можете использовать /my_controller#my_action вместо /my_controller/my_action, вы сможете сделать это.Javascript потребуется загрузить содержимое страницы с помощью AJAX на основе фрагмента URL.

Вот несколько ссылок, которые могут вам помочь:#!) в Facebook и новых URL Twitter для?

http://itsnat.sourceforge.net/php/spim/spi_manifesto_en.php
...