jQuery 1.9 .live () ไม่ใช่ฟังก์ชัน


242

ฉันเพิ่งอัปเดต jQuery จาก 1.8 เป็น 2.1 ทันใดนั้นฉันก็ค้นพบว่า.live()หยุดทำงาน ฉันได้รับข้อผิดพลาด
TypeError: $(...).live is not a function

มีวิธีใดบ้างที่ฉันสามารถใช้แทนได้.live()?

คำตอบ:


509

jQuery .live()ถูกลบในเวอร์ชัน 1.9 เป็นต้นไป

ซึ่งหมายความว่าหากคุณกำลังอัปเกรดจากรุ่น 1.8 และรุ่นก่อนหน้าคุณจะสังเกตเห็นสิ่งต่าง ๆ แตกหักหากคุณไม่ทำตามคำแนะนำในการโยกย้ายด้านล่าง คุณต้องไม่แทนที่.live()ด้วย.on()!


อ่านก่อนที่คุณจะเริ่มทำการค้นหาและแทนที่:

สำหรับการแก้ไขอย่างรวดเร็ว / ร้อนบนเว็บไซต์สดไม่เพียงแค่เปลี่ยนคำหลักliveที่มีon,
เป็นพารามิเตอร์ที่แตกต่างกัน !

.live(events, function)

แผนที่ควรไปที่:

.on(eventType, selector, function)

ตัวเลือก (เด็ก) มีความสำคัญมาก! หากคุณไม่จำเป็นต้องใช้วิธีนี้ด้วยเหตุผลใด ๆ nullตั้งค่าให้


ตัวอย่างการโยกย้าย 1:

ก่อน:

$('#mainmenu a').live('click', function)

หลังจากนั้นคุณย้ายองค์ประกอบลูก ( a) ไปยัง.on()ตัวเลือก:

$('#mainmenu').on('click', 'a', function)

ตัวอย่างการโยกย้าย 2:

ก่อน:

$('.myButton').live('click', function)

หลังจากนั้นคุณย้ายองค์ประกอบ ( .myButton) ไปยัง.on()ตัวเลือกและค้นหาองค์ประกอบหลักที่ใกล้ที่สุด (ควรมี ID):

$('#parentElement').on('click', '.myButton', function)

หากคุณไม่ทราบว่าควรใส่อะไรเป็นพาเรนต์bodyจะใช้งานได้เสมอ:

$('body').on('click', '.myButton', function)

ดูสิ่งนี้ด้วย:


56

คุณสามารถหลีกเลี่ยงการ refactoring รหัสของคุณโดยการรวมรหัส JavaScript ต่อไปนี้

jQuery.fn.extend({
    live: function (event, callback) {
       if (this.selector) {
            jQuery(document).on(event, this.selector, callback);
        }
        return this;
    }
});

3
ควรรวม a return this;ที่ท้ายฟังก์ชั่นเพื่อรักษาความสามารถในการผูกมัด
Guerilla

การใช้สิ่งนี้จะทำให้เกิดปัญหาใด ๆ ในอนาคตหรือไม่
อิสลาม Elshobokshy

15

รายการเอกสาร jQuery API live()ว่าเลิกเป็นของรุ่น 1.7 และลบออกเป็นรุ่น 1.9: การเชื่อมโยง

เลิกใช้เวอร์ชัน: 1.7, ถูกลบ: 1.9

นอกจากนี้ยังระบุว่า:

ตั้งแต่ jQuery 1.7 วิธีการ. live () เลิกใช้แล้ว ใช้. on ()เพื่อแนบตัวจัดการเหตุการณ์ ผู้ใช้งาน jQuery เวอร์ชันเก่าควรใช้. delegate ()ตามความต้องการของ. live ()


ขอบคุณที่กล่าวถึงเวอร์ชั่นที่ใช้งานร่วมกันได้: .degegate ()
Edward Olamisan

13

ส่งต่อพอร์ต.live()สำหรับ jQuery> = 1.9 หลีกเลี่ยงการสร้างการอ้างอิง JS อีกครั้งบนการ.live() ใช้บริบทตัวเลือก DOM ที่ปรับให้เหมาะสม

/** 
 * Forward port jQuery.live()
 * Wrapper for newer jQuery.on()
 * Uses optimized selector context 
 * Only add if live() not already existing.
*/
if (typeof jQuery.fn.live == 'undefined' || !(jQuery.isFunction(jQuery.fn.live))) {
  jQuery.fn.extend({
      live: function (event, callback) {
         if (this.selector) {
              jQuery(document).on(event, this.selector, callback);
          }
      }
  });
}

สิ่งนี้ทำงานได้ดีมากสำหรับกรณีของฉัน: ต้องทำงานโดยมีอำนาจหน้าที่ใน jQuery 1.11.2 ขอบคุณ!
vcoppolecchia



5

การแก้ไขที่ง่ายมากที่ไม่จำเป็นต้องเปลี่ยนรหัสของคุณเพียงเพิ่มสคริปต์การย้ายข้อมูล jquery ดาวน์โหลดได้ที่นี่ https://github.com/jquery/jquery-migrate/

มันให้การเลิก jquery แต่ฟังก์ชั่นที่จำเป็นเช่น "สด", "เบราว์เซอร์" ฯลฯ


2

ฉันมักจะไม่ใช้. on () ไวยากรณ์ถ้าไม่จำเป็น ตัวอย่างเช่นคุณสามารถย้ายข้อมูลได้ง่ายขึ้นเช่นนี้:

อายุ:

$('.myButton').live('click', function);

ใหม่:

$('.myButton').click(function)

นี่คือรายการของตัวจัดการเหตุการณ์ที่ถูกต้อง: https://api.jquery.com/category/forms/


3
ฉันคิดว่าต้องใช้ไวยากรณ์. on () สำหรับเนื้อหาที่โหลดแบบไดนามิก (ตัวอย่างเช่นองค์ประกอบที่เพิ่มหลังจากโหลดหน้าเว็บแล้ว)
T30

1

หากคุณใช้พลอย jQuery ของ Ruby on Rails jquery-railsและด้วยเหตุผลบางประการที่ทำให้คุณไม่สามารถสร้างรหัสดั้งเดิมของคุณได้รุ่นล่าสุดที่ยังคงรองรับคือ2.1.3และคุณสามารถล็อคได้โดยใช้ไวยากรณ์ต่อไปนี้Gemfile:

gem 'jquery-rails', '~> 2.1', '= 2.1.3'

จากนั้นคุณสามารถใช้คำสั่งต่อไปนี้เพื่ออัปเดต:

bundle update jquery-rails

ฉันหวังว่าจะช่วยให้ผู้อื่นประสบปัญหาคล้ายกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.