ฉันจะทำให้ jQuery ประกอบด้วยตัวพิมพ์เล็กและใหญ่รวมถึง jQuery 1.8+ ได้อย่างไร


91

ฉันกำลังพยายามใช้ตัวพิมพ์ "มี" อย่างไม่ใส่ใจ ฉันลองใช้วิธีแก้ปัญหาที่คำถาม stackoverflow ต่อไปนี้ แต่ไม่ได้ผล:

มี jQuery ที่ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่: มีตัวเลือกหรือไม่

เพื่อความสะดวกระบบจะคัดลอกโซลูชันที่นี่:

jQuery.extend(
        jQuery.expr[':'], { 
                Contains : "jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase())>=0" 
});

นี่คือข้อผิดพลาด:

Error: q is not a function
Source File: /js/jquery-1.4.js?ver=1.4
Line: 81

นี่คือที่ที่ฉันใช้:

  $('input.preset').keyup(function() {
    $(this).next().find("li").removeClass("bold");
    var theMatch = $(this).val();
    if (theMatch.length > 1){
      theMatch = "li:Contains('" + theMatch + "')";
      $(this).next().find(theMatch).addClass("bold");
    }
  });

การใช้ตัวพิมพ์เล็กและใหญ่ดั้งเดิมของฉัน "มี" ในสถานการณ์เดียวกันทำงานได้โดยไม่มีข้อผิดพลาด ใครมีความคิดบ้างไหม? ฉันจะขอบคุณมัน


ในกรณีที่ใครสนใจผมได้ปรับปรุงของฉันโพสต์บล็อกสามเพิ่มเติมมีเตอร์:containsExact, :containsExactCaseและ:containsRegexตัวเลือกตอนนี้การทำงานในทุกรุ่นของ jQuery
Mottie


ฉันคิดว่า. filter () เป็นอีกวิธีหนึ่งที่ดี อ้างอิง
劉鎮瑲

คำตอบ:


127

นี่คือสิ่งที่ฉันใช้ในโครงการปัจจุบันไม่มีปัญหาใด ๆ ดูว่าคุณโชคดีกว่ากับรูปแบบนี้หรือไม่:

jQuery.expr[':'].Contains = function(a, i, m) { 
  return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase()) >= 0; 
};

ใน jQuery 1.8 API สำหรับสิ่งนี้เปลี่ยนแปลงเวอร์ชัน jQuery 1.8+ จะเป็น:

jQuery.expr[":"].Contains = jQuery.expr.createPseudo(function(arg) {
    return function( elem ) {
        return jQuery(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0;
    };
});

คุณสามารถทดสอบได้ที่นี่ สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับ 1.8+ เตอร์ที่กำหนดเองตรวจสอบวิกิพีเดีย Sizzle ที่นี่


คุณเป็นผู้ช่วยชีวิต ขอบคุณ.
Matrym

3
มีโอกาสที่คุณจะพูดคุยเกี่ยวกับสิ่งที่กำลังทำอยู่?
Abe Miessler

4
@ClovisSix - ขอบคุณสำหรับการแจ้งเตือนฉันให้ 1.8+ วิธีการทำเช่นเดียวกันแจ้งให้เราทราบหากคุณมีปัญหาใด ๆ
Nick Craver

1
โปรดทราบว่าสิ่งนี้ไม่ได้แทนที่: มีเพียงแค่เพิ่มตัวเลือกอื่น: ประกอบด้วย
albanx

3
ควรเรียกตัวเลือกicontainsหรือสิ่งที่คล้ายกัน
Sebastian

43

เป็นที่น่าสังเกตว่าคำตอบนั้นถูกต้อง แต่ครอบคลุมเท่านั้น:Containsไม่ใช่นามแฝง:containsที่อาจนำไปสู่พฤติกรรมที่ไม่คาดคิด (หรือสามารถใช้โดยการออกแบบสำหรับแอปพลิเคชันขั้นสูงที่ต้องการทั้งการค้นหาที่ละเอียดอ่อนและไม่ละเอียดอ่อน)

สิ่งนี้สามารถแก้ไขได้โดยการทำสำเนาส่วนขยายสำหรับนามแฝง:

jQuery.expr[':'].Contains = function(a, i, m) { 
  return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase()) >= 0; 
};
jQuery.expr[':'].contains = function(a, i, m) { 
  return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase()) >= 0; 
};

ฉันใช้เวลาสักพักเพื่อหาสาเหตุว่าทำไมมันถึงไม่ได้ผลสำหรับฉัน


ฉันจะแสดงความคิดเห็นนี้ในข้างต้น แต่เห็นได้ชัดว่าฉันทำไม่ได้
Ellipsis

5
ฉันไม่แน่ใจว่าคุณได้รับอะไรจากที่นี่ :containsนี้จะแทนที่คาดว่าพฤติกรรมของเอกสาร ฉันคิดว่ามันเป็นที่ชัดเจนที่จะออกจากเดิมเพียงอย่างเดียวและเรียกตัวเลือกใหม่ของคุณ:contains :icontains
Justin Force

5
นั่นคือข้างประเด็นของโพสต์ของฉัน การสร้างตัวเลือกทางเลือกเป็นตัวเลือกที่ถูกต้องอย่างไรก็ตามฉันกำลังชี้ให้เห็นว่าการขยาย: มี แต่การละเลยที่จะขยาย: ประกอบด้วยอาจทำให้ผู้ใช้สับสนเมื่อให้ผลลัพธ์ที่แตกต่างกัน
Ellipsis

1
แล้วขอขอบคุณสำหรับการแบ่งปัน "gotcha" นี้ :) ถึงกระนั้นฉันคิดว่ามันเป็นความคิดที่ดีที่จะพูดถึงว่าจะดีกว่าที่จะไม่ลบล้างพฤติกรรมในตัวเมื่อการสร้างพฤติกรรมคู่ขนานที่ไม่ทำลายล้างทำได้ดีกว่า
Justin Force

ฉันลองใช้วิธีแก้ปัญหาต่างๆที่โพสต์ไว้สำหรับสิ่งนี้และในที่สุดก็ใช้ได้ ขอบคุณ.
taylor michels

27

ฉันจะทำอะไรแบบนี้

     $.expr[':'].containsIgnoreCase = function (n, i, m) {
        return jQuery(n).text().toUpperCase().indexOf(m[3].toUpperCase()) >= 0;
    };

และปล่อยให้:containsอยู่คนเดียว ...

การสาธิต

เหตุใด jQuery จึงไม่รองรับในไลบรารี! ถ้ามันง่ายขนาดนั้น ...

เพราะ รหัสของคุณผ่านรหัสไก่งวงหรือไม่?


6

อาจจะสาย .... แต่,

ฉันอยากไปทางนี้ ..

$.extend($.expr[":"], {
"MyCaseInsensitiveContains": function(elem, i, match, array) {
return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
}
});

ด้วยวิธีนี้คุณจะไม่ยุ่งเกี่ยวกับ NATIVE ".contains"ของ jQuery ... คุณอาจต้องใช้ค่าเริ่มต้นในภายหลัง ... หากถูกดัดแปลงคุณอาจพบว่าตัวเองกลับไปใช้stackOverFlow ...


0

ฉันจะอนุญาตให้ตัวเองเพิ่มเพื่อนของฉัน:

$.expr[":"].containsNoCase = function (el, i, m) { 
    var search = m[3]; 
    if (!search) return false; 
    return eval("/" + search + "/i").test($(el).text()); 
}; 

0

ฉันสามารถเพิกเฉยต่อความอ่อนไหวของกรณีของ jQuery โดยสิ้นเชิงเพื่อให้บรรลุสิ่งที่ฉันต้องการโดยใช้รหัสด้านล่าง:

            $.expr[":"].contains = $.expr.createPseudo(function(arg) {
            return function( elem ) {
                return $(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0;
            };
        });

คุณสามารถใช้ลิงค์นี้เพื่อค้นหาโค้ดตามเวอร์ชัน jQuery ของคุณเพื่อละเว้นความไวของตัวพิมพ์เล็กและใหญ่ https://css-tricks.com/snippets/jquery/make-jquery-contains-case-insensitive/

นอกจากนี้หากคุณต้องการใช้: มีและทำการค้นหาบางอย่างคุณอาจต้องการดูสิ่งนี้: http://technarco.com/jquery/using-jquery-search-html-text-and-show-or-hide- ตามนั้น

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