2013-08-06 35 views
13

Tôi dường như gặp sự cố với việc mở và đóng chương trình Bảng điều khiển JQM 1.3.Bảng điều khiển jQuery Mobile 1.3 không hoạt động sau khi thay đổi trang

EDIT: Đây là cho JQM 1.3.x không 1.4+

Nó là hơi khó để giải thích, vì vậy tôi chỉ cần thực hiện một fiddle :)

Có rất nhiều xảy ra trong fiddle , nhưng nó chỉ là một mẫu của một ứng dụng lớn hơn nhiều và truyền tải vấn đề.

Làm thế nào để tái tạo:

  1. Đến Fiddle
  2. On Fiddle mở Panel và đi đến trang Hai
  3. Ở Trang Hai Panel được mở ra và đi đến trang Một
  4. Cố gắng Mở Bảng điều khiển bây giờ trên trang một, nó không có gì.

trình duyệt bị ảnh hưởng:

EDIT: Điều này dường như được cố định trong Chrome 30.0.1599.101 m

  • Chrome 28.0.1500.95 m
  • IE 10.0.9200.16635
  • Safari // Latest Ver
  • Android WebView (4.2.2)

trình duyệt không bị ảnh hưởng:

  • Firefox 23
  • Opera 12,16

Liên kết đến Fiddle:

http://jsfiddle.net/q2YH3/

Liên kết đến bài viết khác

https://github.com/jquery/jquery-mobile/issues/6308

http://forum.jquery.com/topic/panel-not-responding-after-page-change

EDIT: Vì vậy, Firefox mang lại cho tôi một lỗi mà không phải Chrome hoặc IE làm.

Khi tôi bấm vào để trở lại trang một, tôi nhận được:

Type Error: elem is undefined

Các lỗi được ném bởi JQ 1.9.1, tôi theo dõi nó lại vấn đề này:

A method for determining if a DOM node can handle the data expando 
    acceptData: function(elem) { 
     // Do not set data on non-element because it will not be cleared (#8335). 
     if (elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9) { 
      return false; 
     } 

     var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ]; 

     // nodes accept data unless otherwise specified; rejection can be conditional 
     return !noData || noData !== true && elem.getAttribute("classid") === noData; 
    } 
` 

Lưu ý:

Đừng đặt dữ liệu trên phi nguyên tố vì nó sẽ không được xóa (# 8335).

Github Issue Link: https://github.com/jquery/jquery/pull/1232

OG Code:

$('.showMenu').on('click', function(){ 
$.mobile.loading('hide'); 
$.mobile.activePage.find('#'+$.mobile.activePage.attr('id')+'P').panel("toggle"); 
}); 

$('.btnMenuItem').on('click', function(event){ 
myPgActions.nav(event, function(target){ 
    $.mobile.changePage(target); 
}, false); 
}); 

var myPgActions = {}; 

myPgActions = { 
nav: function(event, callback, manualHash){ 
    var PID = $.mobile.activePage.attr('id'), 
    target = (!!event) ? event.target.name : manualHash;  
    $("#"+PID+"P").panel("close"); 
    if(PID != 'loading') $("#"+PID+"Iframe").hide();   

    if(PID == target){ 
     $("#"+PID+"Iframe").hide('fast', function(){ 
      $("#"+PID+"Iframe").attr('src', ""); 

      myPgActions.update(PID, target, 'refresh', function(target){ 
       callback(target) 
      }); 
     }); 

    }else{ 

     this.update(PID, target, 'change', function(target){ 
      callback(target); 
     }); 

    } 

},// end get 

update: function(PID, target, type, updateCallback){ 

    var ifReady = $.Deferred(); 

    if(type == 'refresh'){ 

     this.buildUrl(PID, function(url){ 

      $('#'+PID+'Iframe').attr('src', url); 
      ifReady.resolve();   

      $.when(ifReady).then(function(){ 
       updateCallback('#'+PID+'Iframe')   
      }); 
     }); 

    }else if(type == 'change'){ 

     this.buildUrl(target, function(url){ 
      $('#'+target+'Iframe').attr('src', url); 
      ifReady.resolve(); 
     }); 

     $.when(ifReady).then(function(){ 
      updateCallback('#'+target); 
     }); 
    } 
}, // end set 
buildUrl: function(page, buildCallback){ 
    switch(page){ 
     case 'dash':   
      var mobileSiteUrl = 'URL with options for iframe' 
      setTimeout(function(){buildCallback(mobileSiteUrl);},25); 
     break; 
     case 'local': 
      var mobileSiteUrl = 'URL with options for iframe' 
      setTimeout(function(){buildCallback(mobileSiteUrl);},25); 
     break; 


    }// End Switch 
} 
}// End Obj 
+0

Bạn nên sử dụng '.panel ('open')' và '.panel ('close')' không ẩn và chuyển đổi. – Omar

+0

Nếu bạn đang sử dụng JQM 1.4alpha1, có một lỗi trong tiện ích bảng điều khiển, điều này cũng có thể giải thích vấn đề của bạn – frequent

+1

@Omar ở đây là một câu đố chia nhỏ bằng cách sử dụng Mở và Đóng, nhưng tôi có cùng kết quả. http://jsfiddle.net/XhupG/ – Red2678

Trả lời

12

Đã cùng một vấn đề, bảng điều khiển không hiển thị sau khi thay đổi trang.

Hai thay đổi nhỏ có thể khắc phục điều đó:

những gì tôi đã làm là thay đổi bảng từ id = "myPanel" để class = "myPanel", sau đó thay đổi các cuộc gọi đến bảng điều khiển để mở: $ ('. MyPanel: visible'). Panel ('open'); - đó là nó!

Vấn đề là bảng điều khiển phải nằm trong trang "jQuery" và sau khi chuyển đổi, nếu bạn đặt bảng điều khiển trong trang đích, bạn thực sự có hai (hoặc nhiều) bảng có cùng id là sai hoặc cùng một lớp là tốt. Vì vậy, bạn chỉ cần thay đổi id thành một lớp và gọi cho một lớp hiển thị.

Làm tôi quá lâu, Hy vọng nó sẽ tiết kiệm thời gian cho người khác.

+0

Hoạt động như một sự quyến rũ. – shamittomar

+1

Chỉ cần lưu ý rằng, trong jQuery 1.4 bạn không còn cần phải làm cho tấm trẻ em của một trang. Bạn có thể có một trang chính nằm bên ngoài trang và có thể được truy cập bởi tất cả các trang, điều này khá thú vị. Liên kết: http://demos.jquerymobile.com/1.4.0/panel-external/ – Red2678

+0

đã tiết kiệm thời gian cho tôi chắc chắn, cảm ơn bạn –

1

Tôi chơi xung quanh với mã của bạn một chút. Tôi nhận thấy rằng nếu tôi đặt một cảnh báo bên trong chức năng cập nhật của bạn, nó sẽ sửa mọi thứ. Vì vậy, tôi đã nghiên cứu lý do tại sao một cảnh báo sẽ làm cho một chương trình làm việc, và tìm thấy trang này. http://ubuntuforums.org/archive/index.php/t-930002.html

"Bạn có lẽ nên biết rằng đánh giá JavaScript của 'nhìn về phía trước' loại:. Kịch bản đã chạy khi nó vẫn đang được đánh giá (và trong khi trang bản thân vẫn đang được đánh giá) Bây giờ là lý do tại sao chúng tôi khuyên bạn nên bỏ tất cả các tham chiếu đến tập lệnh trong phần trang của bạn, vì nó sẽ khiến JavaScript được đánh giá đầy đủ trước khi bạn (thường) có thể gọi hàm (trình xử lý sự kiện) và do đó tránh các lỗi không xác định.

Hiện tại, lệnh gọi cảnh báo() có 2 hiệu ứng: (1) bật lên hộp tin nhắn (cho đến giờ, quá tốt) ;. (2) nó tạm dừng luồng mà JavaScript đang sử dụng! Tuy nhiên, của trình duyệt o ther luồng vẫn sẽ tiếp tục (HTML rendering ...). Vì vậy, nó có thể là một trong những trường hợp mà bạn sẽ được hưởng lợi từ một phương thức tạm dừng thanh lịch hơn, đó là chỉ thực hiện kịch bản này (một phần của tập lệnh) khi tài liệu đã được nạp đầy đủ; "

Giải pháp mà họ đề xuất là đưa kịch bản của bạn bên trong. Hoặc sử dụng "stateChanged() chức năng được yêu cầu http ajax".

0

Vâng tôi upvoted @ bài A.sharif 's, như ông đã nhận các bánh răng trong quay đầu tôi.

các vấn đề nằm trong thực tế là gọi lại của chức năng "BuildUrl" đã được thực thi trước khi biến URL được tạo.

Tôi thou Tôi đã cho phép nhiều thời gian với 25ms nhưng nó không được. Tôi đã tăng thời gian trước khi gọi lại được thực hiện lên đến 600 ms và nó hoạt động tốt ngay bây giờ.

Tôi chắc chắn có là một giải pháp thanh lịch hơn, nhưng điều này là những gì tôi nhận được;)

New Fiddle:

http://jsfiddle.net/t8zyQ/

giá trị của gì đã được thay đổi là trong setTimeout() đến .

Mã thay đổi:

buildUrl: function(page, buildCallback){ 
    switch(page){ 
     case 'dash':   
      var mobileSiteUrl = 'URL with options for iframe' 
      setTimeout(function(){buildCallback(mobileSiteUrl);},600); 
     break; 
     case 'local': 
      var mobileSiteUrl = 'URL with options for iframe' 
      setTimeout(function(){buildCallback(mobileSiteUrl);},600); 
     break; 


    }// End Switch 
Các vấn đề liên quan