2010-02-26 36 views
15

Tôi đang làm động một số yếu tố lỗi/xác thực trên một trang. Tôi muốn họ bị trả lại và được đánh dấu, nhưng cùng một lúc nếu có thể. Dưới đây là những gì tôi hiện đang làm:Làm cách nào để có thể thực hiện nhiều hiệu ứng jquery đồng thời?

var els = $(".errorMsg"); 
els.effect("bounce", {times: 5}, 100); 
els.effect("highlight", {color: "#ffb0aa"}, 300); 

Điều này khiến các phần tử bị trả lại đầu tiên, và THEN được tô sáng và tôi muốn chúng xuất hiện đồng thời. Tôi biết rằng với .animate() bạn có thể chỉ định queue:false trong các tùy chọn, nhưng tôi không muốn sử dụng ảnh động vì hiệu ứng dựng sẵn "thoát" và "đánh dấu" chính xác là những gì tôi muốn.

Tôi đã thử chỉ đơn giản là chuỗi các cuộc gọi như els.effect().effect() và điều đó không hiệu quả. Tôi cũng đã cố gắng để đặt queue:false trong các đối tượng tùy chọn tôi vượt qua, và điều đó không hoạt động.

+0

Phiên bản nào của jQuery bạn đang sử dụng? –

+0

1.4.2, Giao diện người dùng 1.7.2. Vì vậy, ổn định mới nhất của cả hai tại thời điểm viết bài này. –

Trả lời

8

Ok, vì vậy đây là giải pháp rất tùy chỉnh kết hợp hiệu ứng phản hồi và đánh dấu. Tôi muốn nhìn thấy một số loại hỗ trợ jquery để kết hợp các dễ dàng hơn, xác định {queue: false}, nhưng tôi không nghĩ rằng nó đơn giản.

Những gì tôi đã làm là lấy jquery.effects.bounce.js và jquery.effects.highlight.js (từ jquery-ui-1.8rc3), và kết hợp các mã của hai như Daves đề nghị, để tạo ra một mới hiệu ứng có tên "hibounce". Trong thử nghiệm của tôi, nó hỗ trợ tất cả các tùy chọn của cả hai, và chúng xảy ra đồng thời. No trông tuyệt! Tôi không phải là lớn fan hâm mộ của các giải pháp như thế này mặc dù, vì yếu tố bảo trì. Bất cứ khi nào tôi nâng cấp jquery.ui, tôi cũng sẽ phải cập nhật tệp này theo cách thủ công.

Dù sao, đây là kết quả kết hợp (jquery.effects.hibounce.js)

(function($) { 

$.effects.hibounce = function(o) { 
    return this.queue(function() { 
     // Highlight and bounce parts, combined 
     var el = $(this), 
      props = ['position','top','left','backgroundImage', 'backgroundColor', 'opacity'], 
      mode = $.effects.setMode(el, o.options.mode || 'show'), 
      animation = { 
       backgroundColor: el.css('backgroundColor') 
      }; 

     // From highlight 
     if (mode == 'hide') { 
      animation.opacity = 0; 
     } 

     $.effects.save(el, props); 

     // From bounce 
     // Set options 
     var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode 
     var direction = o.options.direction || 'up'; // Default direction 
     var distance = o.options.distance || 20; // Default distance 
     var times = o.options.times || 5; // Default # of times 
     var speed = o.duration || 250; // Default speed per bounce 
     if (/show|hide/.test(mode)) props.push('opacity'); // Avoid touching opacity to prevent clearType and PNG issues in IE 


     // Adjust 
     $.effects.save(el, props); el.show(); // Save & Show 
     $.effects.createWrapper(el); // Create Wrapper 
     var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left'; 
     var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg'; 
     var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true})/3 : el.outerWidth({margin:true})/3); 
     if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift 
     if (mode == 'hide') distance = distance/(times * 2); 
     if (mode != 'hide') times--; 

     // from highlight 
     el 
      .show() 
      .css({ 
       backgroundImage: 'none', 
       backgroundColor: o.options.color || '#ffff99' 
      }) 
      .animate(animation, { 
       queue: false, 
       duration: o.duration * times * 1.3, // cause the hilight to finish just after the bounces (looks best) 
       easing: o.options.easing, 
       complete: function() { 
        (mode == 'hide' && el.hide()); 
        $.effects.restore(el, props); 
        (mode == 'show' && !$.support.opacity && this.style.removeAttribute('filter')); 
        (o.callback && o.callback.apply(this, arguments)); 
        el.dequeue(); 
       } 
      }); 

     // Animate bounces 
     if (mode == 'show') { // Show Bounce 
      var animation = {opacity: 1}; 
      animation[ref] = (motion == 'pos' ? '+=' : '-=') + distance; 
      el.animate(animation, speed/2, o.options.easing); 
      distance = distance/2; 
      times--; 
     }; 
     for (var i = 0; i < times; i++) { // Bounces 
      var animation1 = {}, animation2 = {}; 
      animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance; 
      animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance; 
      el.animate(animation1, speed/2, o.options.easing).animate(animation2, speed/2, o.options.easing); 
      distance = (mode == 'hide') ? distance * 2 : distance/2; 
     }; 
     if (mode == 'hide') { // Last Bounce 
      var animation = {opacity: 0}; 
      animation[ref] = (motion == 'pos' ? '-=' : '+=') + distance; 
      el.animate(animation, speed/2, o.options.easing, function(){ 
       el.hide(); // Hide 
       $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore 
       if(o.callback) o.callback.apply(this, arguments); // Callback 
      }); 
     } else { 
      var animation1 = {}, animation2 = {}; 
      animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance; 
      animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance; 
      el.animate(animation1, speed/2, o.options.easing).animate(animation2, speed/2, o.options.easing, function(){ 
       $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore 
       if(o.callback) o.callback.apply(this, arguments); // Callback 
      }); 
     }; 
     el.queue('fx', function() { el.dequeue(); }); 
     el.dequeue(); 
    }); 
}; 

})(jQuery); 

Nó có thể được sử dụng như bất kỳ hiệu ứng khác bây giờ:

var el = $("#div1"); 
el.effect("hibounce", {color: "#F00", times: 5}, 100); 
1

Bạn có thể thử này:

var els = $(".errorMsg"); 
setTimeout(function() { 
    els.effect("bounce", {times: 5}, 100); 
}, 1); 
setTimeout(function() { 
    els.effect("highlight", {color: "#ffb0aa"}, 300); 
}, 1); 

Điều đó sẽ gọi cả hai tác dụng ở khoảng thời, đồng bộ.

+0

Tôi sẽ chụp ảnh này vào ngày mai khi tôi quay lại mã, nếu nó hoạt động, tôi sẽ bỏ phiếu và đánh dấu là câu trả lời. Cảm ơn! –

+2

Tôi nghi ngờ điều này sẽ làm việc trong khi phương pháp thẳng về phía trước không thành công. Bạn vẫn đang gọi hàm 'effect' từng cái một. Hãy nhớ rằng Javascript được chạy đơn luồng, vì vậy cả hai sẽ thực hiện tuyến tính. – LiraNuna

+1

LiraNuna gọi nó. Các hình động vẫn còn xếp hàng, và các hiệu ứng thực hiện cái này sau cái kia. Tuy nhiên, LiraNuna, trong khi javascript có thể là luồng đơn, có thể có 2 hiệu ứng được thực thi theo cách có vẻ đồng thời. Bạn chắc chắn có thể làm điều đó bằng cách sử dụng animate của jquery(), bằng cách cung cấp {queue: false} trong các tùy chọn.Trước các CPU đa luồng/đa lõi, các hệ điều hành sử dụng thời gian cắt để chạy nhiều luồng. JS không phải là tất cả những gì khác nhau. –

4

Hiệu ứng hàng đợi hiệu ứng của giao diện người dùng jQuery, vì vậy hãy viết phiên bản của riêng bạn về chức năng phản hồi/đánh dấu. Chỉ cần sao chép mã nguồn từ cả hai vào một chức năng duy nhất, dọn sạch mã, và mỗi khi nó gọi là animate, hãy chắc chắn để có trả lại và nổi bật logic trong đó với nhau.

+0

Tôi đã xem xét tùy chọn này và tôi có thể quay lại nếu thực sự thực sự cần cả hai hiệu ứng. Bây giờ, tôi nội dung để có mã đơn giản hơn, và chỉ sử dụng 1 trong số các hiệu ứng. Đó là quá xấu mà jquery cho phép bạn chỉ định {queue: false} cho các cuộc gọi đến animate(), nhưng không có hiệu lực(). –

11

jQuery UI sẽ xếp hàng những ảnh hưởng theo mặc định. Sử dụng dequeue() để chạy đồng thời:

var opt = {duration: 7000}; 

    $('#lbl').effect('highlight', opt).dequeue().effect('bounce', opt); 

Demo in JsFiddle

+0

Điều này không thực sự hoạt động theo cách nó xuất hiện. Hãy thử đảo ngược thư bị trả lại và đánh dấu và bạn sẽ thấy rằng chúng không thực sự xảy ra cùng một lúc. –

+0

Bạn đúng @CharlesWood. Nó không hoạt động khi 'hightlight' trước khi 'bounce'. Tôi đã chơi xung quanh một chút với fiddle: Các hiệu ứng khác, như 'mù', 'phun' và 'gấp, hoạt động ok với làm nổi bật cuối cùng. Có vẻ là một vấn đề với thư bị trả lại trước khi đánh dấu. Không chắc chắn lý do tại sao – HoffZ

Các vấn đề liên quan