2015-07-08 15 views
13

Tôi đang sử dụng bootstrap của David Sutz multiselect và tôi không thể tìm thấy cách sửa đổi số .dropdown-menu trên onDropdownShow. Thiết lập chiều rộng trong hàm dưới không hoạt động:Làm thế nào để thay đổi chiều rộng của trình đơn thả xuống bằng cách sử dụng plugin Bootstrap Multiselect cho jQuery?

$('#flavor').multiselect({ 
    onDropdownShow: function(event) { 
     $(this).closest('.dropdown-menu').css('width','500px') 
    } 
}); 

Vấn đề đặt trong $(this) mà dường như không có một nút DOM, mặc dù tôi hy vọng nó sẽ #flavor.

Điều tôi đang cố làm là tự động thay đổi chiều rộng của trình đơn tùy thuộc vào chiều rộng của cửa sổ (về cơ bản khiến nó đáp ứng), vì vậy mã cần được thực thi mỗi khi menu được mở. Ngoài ra tôi có nhiều hộp đa lựa chọn trên trang của mình, vì vậy nó thực sự cần phải là một hàm chung mà không có tham chiếu DOM được mã hóa cứng, do đó cần có $(this) để hoạt động.

+0

Bạn có bất kỳ điều gì hay không? Ngoài ra bạn quên dấu chấm phẩy ở cuối. –

+0

@dingo_d Không cần dấu chấm phẩy ở cuối;) Vấn đề đã được giải quyết và câu trả lời đúng đã được chọn. Giải pháp cho vấn đề của tôi đã thay thế $ (this) bằng $ (event.currentTarget). – bart

Trả lời

8

Bạn có thể sử dụng số event để tìm nút nào được nhấp. Từ đó bạn có thể sử dụng jQuery traversal đơn giản để tìm và chỉnh sửa menu thả xuống.

Để có hành vi khác nhau dựa trên menu thả xuống đã được mở, bạn có thể nhắm mục tiêu id của lựa chọn gốc. Sau đó, có thể sử dụng một hàm khác để trả về bất kỳ thay đổi nào được yêu cầu.

$(document).ready(function() { 
 
    $('.dropdowns').multiselect({ 
 
    onDropdownShow: function(event) { 
 
     var menu = $(event.currentTarget).find(".dropdown-menu"); 
 
     var original = $(event.currentTarget).prev("select").attr("id"); 
 
     
 
     // Custom functions here based on original select id 
 
     if (original === "flavour") menu.css("width", 500); 
 
     if (original === "flavour2") menu.css("background", "red"); 
 
     
 
    } 
 
    }); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script> 
 
<script src="https://raw.githubusercontent.com/davidstutz/bootstrap-multiselect/master/dist/js/bootstrap-multiselect.js"></script> 
 
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css"> 
 

 
<select id="flavour" class="dropdowns" multiple="multiple"> 
 
    <option value="cheese">Cheese</option> 
 
    <option value="tomatoes">Tomatoes</option> 
 
    <option value="mozarella">Mozzarella</option> 
 
    <option value="mushrooms">Mushrooms</option> 
 
    <option value="pepperoni">Pepperoni</option> 
 
    <option value="onions">Onions</option> 
 
</select> 
 

 
<select id="flavour2" class="dropdowns" multiple="multiple"> 
 
    <option value="cheese">Cheese</option> 
 
    <option value="tomatoes">Tomatoes</option> 
 
    <option value="mozarella">Mozzarella</option> 
 
    <option value="mushrooms">Mushrooms</option> 
 
    <option value="pepperoni">Pepperoni</option> 
 
    <option value="onions">Onions</option> 
 
</select>

tôi không thể tìm thấy một CDN rằng tổ chức css của plugin nên phong cách sẽ xem xét một chút khác nhau, nhưng mã JS trên công trình.

+0

Tôi có nhiều hộp chọn nhiều lần trên một trang. Tôi muốn trình đơn được đáp ứng, vì vậy khi mở tôi cần phải tự động thay đổi chiều rộng của trình đơn theo chiều rộng của cửa sổ và tùy thuộc vào vị trí của hộp chọn nhiều. Vì vậy, nó không thể chỉ là một số CSS. – bart

+0

Mã mẫu ở trên cho biết cách nhắm mục tiêu nhiều lựa chọn cụ thể. Có thể đáp ứng không được kiểm soát bởi các điểm ngắt và độ rộng%? Có ví dụ cụ thể về độ rộng không? – stevenw00

+0

Các multiselects được đặt cạnh nhau trong một hàng ngang. Các multiselect phát triển đầu tiên (bằng cách kiểm tra các mục bên trong) kết quả trong multiselect thứ hai di chuyển sang phải, hạn chế chiều rộng của thả xuống của nó. Nó thực sự chỉ hoạt động với một giải pháp JavaScript động. – bart

-2

Tôi nghĩ cách sử dụng gần nhất() nên được thay đổi. Thử sử dụng phần tử thẻ, thay vì tên lớp.

$('#flavor').multiselect({ 
    onDropdownShow: function(event) { 
     $(this).closest('select').css('width','500px') 
    } 
}); 

Hãy thử điều này và cho tôi biết nếu cách này không hiệu quả.

+0

Tôi không muốn thay đổi phần tử 'chọn'. Phần tử 'select' thực sự bị ẩn bởi plugin, vì vậy nó sẽ không có tác dụng. – bart

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