javascript - Bootstrap Popover 错误 : Uncaught TypeError: undefined is not a function

标签 javascript jquery twitter-bootstrap

我收到未捕获的类型错误:未定义不是我网站页面上的函数。该功能在所有其他页面上都可以正常运行。它的页面代码有点冗长,所以我只会在需要时发布它,但这是基础知识。

弹出窗口的按钮:

<button class="btn btn-info" id="help" type="button" data-toggle="popover" data-trigger="focus"  data-html="true" data-placement="bottom" title="ActiveMLS Documentation" data-content="<small><p><strong>List Custom Property Listings</strong></p></small>"><i class="fa fa-question-circle"></i></button>

错误

Uncaught TypeError: undefined is not a function shell.js:23

来自 shell.js 第 23 行的 jquery

/*******************************/
/*  POPOVER HELPER
/*******************************/
$(document).ready(function(){
   $('#help').popover()
});

我很困惑为什么它只在这个页面上中断?

<!-- blueimp Gallery styles -->
<link rel="stylesheet" href="/static/uploadlib/css/blueimp-gallery.min.css">
<!-- CSS to style the file input field as button and adjust the Bootstrap progress bars -->
<link rel="stylesheet" href="/static/uploadlib/css/jquery.fileupload-ui.css">
<div class="row-fluid">
    <div class="col-md-12">
        <div class="row-fluid">
            <div class="section-header text-center">
                <button class="btn btn-info" id="help" type="button" data-toggle="popover" data-trigger="focus"  data-html="true" data-placement="bottom" title="ActiveMLS Documentation" data-content="<small><p><strong>List Custom Property Listings</strong> - The list Custom Property listings page is an overview of all the Custom Property listings listings and information displayed on the website frontend</p><ul><li><strong>Add Custom Property Listings</strong> - Shortcut to the <em>Add Custom Property Listings</em> page.</li><li><strong>Records Per Page</strong> - Display any list 10, 25, 50, or 100 records at a time.</li><li><strong>Search</strong> - Search any list by keyword(s).</li><li><strong>Listing ID</strong> - The Custom Property ID of the Custom Property listing.</li><li><strong>Address</strong> - The address of the Custom Property listing.</li><li><strong>Edit Custom Property Listing</strong> - Access the <em>Edit Custom Property Listing</em> page for this listing.</li><li><strong>Delete Custom Property Listing</strong> - Access the <em>Delete Custom Property Listing</em> page for this listing.</li></ul></small>"><i class="fa fa-question-circle"></i></button>
                <!-- TMPL_IF add_mode -->
                <h1>Add Custom Property Listing</h1>
                <!-- /TMPL_IF -->
                <!-- TMPL_IF edit_mode -->
                <h1>Edit Custom Property Listing</h1>
                <!-- /TMPL_IF -->
                <!-- TMPL_IF delete_mode -->
                <h1>Delete Custom Property Listing</h1>
                <!-- /TMPL_IF -->
            </div>
        </div>
        <form id="fileupload" method="post" action="<!-- TMPL_VAR request_path -->">
            <div class="row-fluid">
                <!-- TMPL_IF error_message -->
                    <div class="alert alert-danger alert-dismissable" role="alert" >
                        <button type="button" class="close" data-dismiss="alert"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
                        Warning!<br />
                        <!-- TMPL_VAR error_message ESCAPE=0 -->
                    </div>
                <!-- /TMPL_IF --> 
            </div>
            <div class="row-fluid">
                <fieldset>
                    <div class="form-group col-md-6">
                        <label class="col-md-6">Listing Category</label>
                        <!-- TMPL_VAR category ESCAPE=0 -->
                    </div>
                    <div class="form-group col-md-6">
                        <label class="col-md-6">Listing ID</label>
                        <!-- TMPL_VAR listing_id ESCAPE=0 -->
                    </div>
                    <div class="form-group col-md-6">
                        <label class="col-md-6">Agent Name</label>
                        <!-- TMPL_VAR l_ag1_id ESCAPE=0 -->
                    </div>
                </fieldset>
            </div>
            <hr />
            <div class="row-fluid">
                <fieldset>
                    <div class="form-group col-md-6">
                        <label class="col-md-6">Price</label>
                        <!-- TMPL_VAR price ESCAPE=0 -->
                    </div>
                    <div class="row-fluid">
                        <div class="form-group col-md-6">
                            <label class="col-md-6">Street Address</label>
                            <!-- TMPL_VAR street_no ESCAPE=0 --> <!-- TMPL_VAR street ESCAPE=0 -->
                        </div>
                    </div> 
                    <div class="form-group col-md-6">
                        <label class="col-md-6">City</label>
                        <!-- TMPL_VAR city ESCAPE=0 -->
                    </div>
                    <div class="form-group col-md-6">
                        <label class="col-md-6">State</label>
                        <!-- TMPL_VAR state ESCAPE=0 -->
                    </div>
                    <div class="form-group col-md-6">
                        <label class="col-md-6">Zip Code</label>
                        <!-- TMPL_VAR zip ESCAPE=0 -->
                    </div>
                </fieldset>
            </div>
            <hr />
            <div class="row-fluid">
                <fieldset>
                    <div class="form-group col-md-6">
                        <label class="col-md-6">Description</label>
                        <!-- TMPL_VAR remarks_general ESCAPE=0 -->
                    </div>
                </fieldset>
            </div>
            <hr />
            <div class="row-fluid">
                <fieldset>
                    <div class="form-group col-md-6">
                        <label class="col-md-6">Business Type</label>
                        <!-- TMPL_VAR business_type ESCAPE=0 -->
                    </div>
                    <div class="form-group col-md-6">
                        <label class="col-md-6">For Lease</label>
                        <!-- TMPL_VAR for_lease_yn ESCAPE=0 -->
                    </div>
                    <div class="form-group col-md-6">
                        <label class="col-md-6">For Sale</label>
                        <!-- TMPL_VAR for_sale_yn ESCAPE=0 -->
                    </div>
                    <div class="form-group col-md-6">
                        <label class="col-md-6">Parcel Type</label>
                        <!-- TMPL_VAR parcel_type ESCAPE=0 -->
                    </div>
                    <div class="form-group col-md-6">
                        <label class="col-md-6">Area</label>
                        <!-- TMPL_VAR area_desc ESCAPE=0 -->
                    </div>
                    <div class="form-group col-md-6">
                        <label class="col-md-6">County</label>
                        <!-- TMPL_VAR county ESCAPE=0 -->
                    </div>
                    <div class="form-group col-md-6">
                        <label class="col-md-6">School District</label>
                        <!-- TMPL_VAR schools_d ESCAPE=0 -->
                    </div>
                    <div class="form-group col-md-6">
                        <label class="col-md-6">Elementary School</label>
                        <!-- TMPL_VAR schools_e ESCAPE=0 -->
                    </div>
                    <div class="form-group col-md-6">
                        <label class="col-md-6">High School</label>
                        <!-- TMPL_VAR schools_h ESCAPE=0 -->
                    </div>
                    <div class="form-group col-md-6">
                        <label class="col-md-6">Year Built</label>
                        <!-- TMPL_VAR year_built ESCAPE=0 -->
                    </div>
                    <div class="form-group col-md-6">
                        <label class="col-md-6">Type</label>
                        <!-- TMPL_VAR type ESCAPE=0 -->
                    </div>
                    <div class="form-group col-md-6">
                        <label class="col-md-6">Rooms</label>
                        <!-- TMPL_VAR no_rooms ESCAPE=0 -->
                    </div>
                    <div class="form-group col-md-6">
                        <label class="col-md-6">Bedrooms</label>
                        <!-- TMPL_VAR bdrms ESCAPE=0 -->
                    </div>
                    <div class="form-group col-md-6">
                        <label class="col-md-6">Baths, Full</label>
                        <!-- TMPL_VAR baths_full ESCAPE=0 -->
                    </div>
                    <div class="form-group col-md-6">
                        <label class="col-md-6">Baths, Half</label>
                        <!-- TMPL_VAR baths_part ESCAPE=0 -->
                    </div>
                    <div class="form-group col-md-6">
                        <label class="col-md-6">Approx. Sq. Ft.</label>
                        <!-- TMPL_VAR sqft ESCAPE=0 -->
                    </div>
                    <div class="form-group col-md-6">
                        <label class="col-md-6">Approx. Lot Size</label>
                        <!-- TMPL_VAR lot_size ESCAPE=0 -->
                    </div>
                    <div class="form-group col-md-6">
                        <label class="col-md-6">Approx. Acre</label>
                        <!-- TMPL_VAR acres ESCAPE=0 -->
                    </div>
                    <div class="form-group col-md-6">
                        <label class="col-md-6">Foundation</label>
                        <!-- TMPL_VAR foundation ESCAPE=0 -->
                    </div>
                    <div class="form-group col-md-6">
                        <label class="col-md-6">Exterior</label>
                        <!-- TMPL_VAR exterior ESCAPE=0 -->
                    </div>
                    <div class="form-group col-md-6">
                        <label class="col-md-6">Heating</label>
                        <!-- TMPL_VAR heating ESCAPE=0 -->
                    </div>
                    <div class="form-group col-md-6">
                        <label class="col-md-6">Cooling</label>
                        <!-- TMPL_VAR cooling ESCAPE=0 -->
                    </div>
                    <div class="form-group col-md-6">
                        <label class="col-md-6">Fuel</label>
                        <!-- TMPL_VAR heat_fuel ESCAPE=0 -->
                    </div>
                    <div class="form-group col-md-6">
                        <label class="col-md-6">Parking Spaces</label>
                        <!-- TMPL_VAR gar_prk_no ESCAPE=0 -->
                    </div>
                    <div class="form-group col-md-6">
                        <label class="col-md-6">Sewer</label>
                        <!-- TMPL_VAR sewer ESCAPE=0 -->
                    </div>
                    <div class="form-group col-md-6">
                        <label class="col-md-6">Water</label>
                        <!-- TMPL_VAR water ESCAPE=0 -->
                    </div>
                    <div class="form-group col-md-6">
                        <label class="col-md-6">Fireplace</label>
                        <!-- TMPL_VAR fireplace ESCAPE=0 -->
                    </div>
                    <div class="form-group col-md-6">
                        <label class="col-md-6">Tax 1</label>
                        <!-- TMPL_VAR tax_1 ESCAPE=0 -->
                    </div>
                    <div class="form-group col-md-6">
                        <label class="col-md-6">Tax 2</label>
                        <!-- TMPL_VAR tax_2 ESCAPE=0 -->
                    </div>
                    <div class="form-group col-md-6">
                        <label class="col-md-6">Six Month Tax</label>
                        <!-- TMPL_VAR six_mo_taxes ESCAPE=0 -->
                    </div>
                </fieldset>
            </div>
            <hr />
        <!-- TMPL_IF delete_mode -->
            <p>
            <!-- TMPL_LOOP Thumbnails -->
            <img src="/custom_prop/photo_thumbnail?filename=<!-- TMPL_VAR filename -->">
            <!-- /TMPL_LOOP -->
            </p>
        <!-- TMPL_ELSE -->
        <!-- Start Upload -->
        <noscript><p>JavaScript is required for photo upload.</p></noscript>
        <input type="hidden" name="nonce" value="<!-- TMPL_VAR nonce -->"/>
            <!-- The fileupload-buttonbar contains buttons to add/delete files and start/cancel the upload -->
                <div class="row fileupload-buttonbar">
                    <div class="col-md-7">
                        <!-- The fileinput-button span is used to style the file input field as button -->
                        <span class="btn btn-success fileinput-button">
                            <i class="icon-plus icon-white"></i>
                            <span>Add photos...</span>
                            <input type="file" name="files" multiple>
                        </span>
                        <button type="submit" class="btn btn-primary start">
                            <i class="icon-upload icon-white"></i>
                            <span>Start upload</span>
                        </button>
                        <button type="reset" class="btn btn-warning cancel">
                            <i class="icon-ban-circle icon-white"></i>
                            <span>Cancel upload</span>
                        </button>
                        <button type="button" class="btn btn-danger delete">
                            <i class="icon-trash icon-white"></i>
                            <span>Delete</span>
                        </button>
                        <!-- The loading indicator is shown during file processing -->
                        <span class="fileupload-loading"></span>
                    </div>
                    <!-- The global progress information -->
                    <div class="span5 fileupload-progress fade">
                        <!-- The global progress bar -->
                        <div class="progress progress-success progress-striped active" role="progressbar" aria-valuemin="0" aria-valuemax="100">
                            <div class="bar" style="width:0%;"></div>
                        </div>
                        <!-- The extended global progress information -->
                        <div class="progress-extended">&nbsp;</div>
                    </div>
                </div>
                <!-- The table listing the files available for upload/download -->
                <table role="presentation" class="table table-striped"><tbody class="files"></tbody></table>
                <!-- The blueimp Gallery widget -->
                <div id="blueimp-gallery" class="blueimp-gallery blueimp-gallery-controls" data-filter=":even">
                    <div class="slides"></div>
                    <h3 class="title"></h3>
                    <a class="prev">‹</a>
                    <a class="next">›</a>
                    <a class="close">×</a>
                    <a class="play-pause"></a>
                    <ol class="indicator"></ol>
                </div>
            <!-- /TMPL_IF -->
          <div class="row">
                <div class="col-md-6">
                <!-- TMPL_IF edit_mode -->
                <input type="submit" name="submit" class="btn btn-primary" value="Save"/>
                <input type="submit" name="cancel" class="btn" value="Cancel"/>
                <!-- /TMPL_IF -->
                <!-- TMPL_IF add_mode -->
                <input type="submit" name="submit" class="btn btn-primary" value="Save"/>
                <input type="submit" name="cancel" class="btn" value="Cancel"/>
                <!-- /TMPL_IF -->
                <!-- TMPL_IF delete_mode -->
                <p>Are you sure you want to delete this listing?</p>
                <input type="submit" name="confirm" class="btn btn-primary" value="Yes"/>
                <input type="submit" name="cancel" class="btn" value="No"/>
                <!-- /TMPL_IF -->
            </div>
          </div>
        </form>
    </div>
</div>


<!-- The template to display files available for upload -->
<script id="template-upload" type="text/x-tmpl">
{% for (var i=0, file; file=o.files[i]; i++) { %}
    <tr class="template-upload fade">
        <td>
            <span class="preview"></span>
        </td>
        <td>
            <p class="name">{%=file.name%}</p>
            {% if (file.error) { %}
                <div><span class="label label-important">Error</span> {%=file.error%}</div>
            {% } %}
        </td>
        <td>
            <p class="size">{%=o.formatFileSize(file.size)%}</p>
            {% if (!o.files.error) { %}
                <div class="progress progress-success progress-striped active" role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-valuenow="0"><div class="bar" style="width:0%;"></div></div>
            {% } %}
        </td>
        <td>
            {% if (!o.files.error && !i && !o.options.autoUpload) { %}
                <button class="btn btn-primary start">
                    <i class="icon-upload icon-white"></i>
                    <span>Start</span>
                </button>
            {% } %}
            {% if (!i) { %}
                <button class="btn btn-warning cancel">
                    <i class="icon-ban-circle icon-white"></i>
                    <span>Cancel</span>
                </button>
            {% } %}
        </td>
    </tr>
{% } %}
</script>
<!-- The template to display files available for download -->
<script id="template-download" type="text/x-tmpl">
{% for (var i=0, file; file=o.files[i]; i++) { %}
    <tr class="template-download fade">
        <td>
            <span class="preview">
                {% if (file.thumbnailUrl) { %}
                    <a href="{%=file.url%}" title="{%=file.name%}" download="{%=file.name%}" data-gallery><img src="{%=file.thumbnailUrl%}"></a>
                {% } %}
            </span>
        </td>
        <td>
            <p class="name">
                <a href="{%=file.url%}" title="{%=file.name%}" download="{%=file.name%}" {%=file.thumbnailUrl?'data-gallery':''%}>{%=file.name%}</a>
            </p>
            {% if (file.error) { %}
                <div><span class="label label-important">Error</span> {%=file.error%}</div>
            {% } %}
        </td>
        <td>
            <span class="size">{%=o.formatFileSize(file.size)%}</span>
        </td>
        <td>
            <button class="btn btn-danger delete" data-type="{%=file.deleteType%}" data-url="{%=file.deleteUrl%}"{% if (file.deleteWithCredentials) { %} data-xhr-fields='{"withCredentials":true}'{% } %}>
                <i class="icon-trash icon-white"></i>
                <span>Delete</span>
            </button>
        </td>
    </tr>
{% } %}
</script>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
<!-- The jQuery UI widget factory, can be omitted if jQuery UI is already included -->
<script src="/static/uploadlib/js/vendor/jquery.ui.widget.js"></script>
<!-- The Templates plugin is included to render the upload/download listings -->
<script src="/static/uploadlib/js/tmpl.min.js"></script>
<!-- The Load Image plugin is included for the preview images and image resizing functionality -->
<script src="/static/uploadlib/js/load-image.min.js"></script>
<!-- blueimp Gallery script -->
<script src="/static/uploadlib/js/jquery.blueimp-gallery.min.js"></script>
<!-- The Iframe Transport is required for browsers without support for XHR file uploads -->
<script src="/static/uploadlib/js/jquery.iframe-transport.js"></script>
<!-- The basic File Upload plugin -->
<script src="/static/uploadlib/js/jquery.fileupload.js"></script>
<!-- The File Upload processing plugin -->
<script src="/static/uploadlib/js/jquery.fileupload-process.js"></script>
<!-- The File Upload image preview & resize plugin -->
<script src="/static/uploadlib/js/jquery.fileupload-image.js"></script>
<!-- The File Upload validation plugin -->
<script src="/static/uploadlib/js/jquery.fileupload-validate.js"></script>
<!-- The File Upload user interface plugin -->
<script src="/static/uploadlib/js/jquery.fileupload-ui.js"></script>
<!-- The main application script -->
<script>
$(function () {
    'use strict';
    // Initialize the jQuery File Upload widget:
    $('#fileupload').fileupload({
        url: '/custom_prop/file_upload_handler?nonce=<!-- TMPL_VAR nonce -->'
    });
        // Load existing files:
        $('#fileupload').addClass('fileupload-processing');
        $.ajax({
            url: $('#fileupload').fileupload('option', 'url'),
            dataType: 'json',
            context: $('#fileupload')[0]
        }).always(function () {
            $(this).removeClass('fileupload-processing');
        }).done(function (result) {
            $(this).fileupload('option', 'done')
                .call(this, null, {result: result});
        });
});
</script>
<!-- End Upload -->

最佳答案

还有其他要检查的东西。

如果您在 jquery.js 之前包含 bootstrap.js,也可能导致这种情况。 因此,请确保在 bootstrap 之前包含 jQuery

在我的例子中,问题如下:

实际上我使用的是 pre-jQuery Rails,所以当我包含 Bootstrap JS 文件时,我不认为包含 jQuery 与它们捆绑在一起会导致任何问题,但是当我删除那个 JS 文件时,一切都开始正常工作。

Also one more possible case is, there could be multiple instances of jQuery in the page. So search for a duplicate version of jQuery and remove them if there is any.

这里有一个很好的链接可以看看。

Avoiding Conflicts with Other Libraries

关于javascript - Bootstrap Popover 错误 : Uncaught TypeError: undefined is not a function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26763112/

相关文章:

javascript - JS : Is eval really secure?

javascript - 变换 : translateY Not Working on Style Attribute in IE/Edge

javascript - 使用 jQuery Sortable 将项目拖放到空白处

css - 在 Bootstrap 面板中浏览器忽略了第 nth-child

css - Rails 4 在 Heroku 上定位 Bootstrap 字形图标

javascript - 找不到用于排序/更改 <div> 结构的 Jquery 脚本,有什么想法吗?

javascript - Angular 2 map.set 不是一个函数

javascript - 日期时间范围查询

javascript - Jquery 日期比较

html - 使 Bootstrap 导航下拉菜单仅在小屏幕上打开