在页面加载时修改 MDL 元素
Modifying MDL elements on page load
我试图在页面加载时设置 mdl 滑块的值。为 mdl 滑块设置值的推荐方法是这样的 -
document.querySelector('#slider').MaterialSlider.change(value);
然而,如果从 $(document).ready()
或 $(window).load()
调用,则会抛出错误 TypeError: document.querySelector(...).MaterialSlider is undefined
。
设置一秒的超时时间解决了这个问题,但看起来很老套。
我可以将它与任何其他事件联系起来以确保它有效吗?
这就是我加载脚本的方式 --
//mobile optimized
meta(name='viewport', content='width=device-width, initial-scale=1.0')
//css
link(rel='stylesheet', href='/stylesheets/style.css')
//material-design-lite
link(rel='stylesheet', href='/bower_components/material-design-lite/material.min.css')
script(src='/bower_components/material-design-lite/material.min.js')
link(rel='stylesheet', href='https://fonts.googleapis.com/icon?family=Material+Icons')
//jQuery
script(src='/bower_components/jquery/dist/jquery.min.js')
//Material icon fonts
//link(rel="stylesheet", href="https://fonts.googleapis.com/icon?family=Material+Icons")
link(href='https://fonts.googleapis.com/css?family=Open+Sans', rel='stylesheet', type='text/css')
//polyfill (support for dialog)
script(src="/bower_components/dialog-polyfill/dialog-polyfill.js")
link(rel="stylesheet", type="text/css", href="/bower_components/dialog-polyfill/dialog-polyfill.css")
根据您的错误消息,我同意 @e666 正在关闭的问题行。其他一些要检查的事情是您相对于其他脚本加载 MDL 的位置。 Script loading can get a bit tricky sometimes.
除此之外,如果您要在服务器上动态构建 HTML 页面,您还可以考虑直接在 DOM 中设置滑块的值。
例如,滑块的 HTML 看起来像这样:
<p style="width:300px">
<input class="mdl-slider mdl-js-slider" type="range" id="s1" min="0" max="10" value="4" step="2">
</p>
注意 value
选项。如果这对您来说是一种可能的选择,您可以使用服务器端代码动态设置该值。
如果您使用的是 ASP.NET,您可能会这样做。
@model MyModel
<div>
<p style="width:300px">
<input class="mdl-slider mdl-js-slider" type="range" id="s1" min="0" max="10" value="@Model.InitialValue" step="2">
</p>
</div>
但是,如果您在 JavaScript 加载时遇到问题,我建议您在继续之前确保所有内容都正确加载,因为它可能会在以后影响您。
您的滑块和 javascript 代码的顺序是什么?
如果您先调用您的函数然后创建滑块,该函数将找不到它。这可能是它未定义的原因。
这也是它在等待一秒钟后起作用的原因。在这一秒内,页面已完全加载,可以找到滑块。
如果先创建滑块然后再更改它,则可以对其进行操作。
您可以使用滑块后的代码块执行此操作,其中调用了更改滑块值的函数。
我花了几个月的时间,但终于找到了解决办法。只需要添加这个 --
$( document ).ready(function() {
componentHandler.upgradeAllRegistered();
// --- do stuff on mdl elements here ---
});
这有一个额外的好处,即在完全加载之前隐藏丑陋的 mdl 组件版本。
我试图在页面加载时设置 mdl 滑块的值。为 mdl 滑块设置值的推荐方法是这样的 -
document.querySelector('#slider').MaterialSlider.change(value);
然而,如果从 $(document).ready()
或 $(window).load()
调用,则会抛出错误 TypeError: document.querySelector(...).MaterialSlider is undefined
。
设置一秒的超时时间解决了这个问题,但看起来很老套。 我可以将它与任何其他事件联系起来以确保它有效吗?
这就是我加载脚本的方式 --
//mobile optimized
meta(name='viewport', content='width=device-width, initial-scale=1.0')
//css
link(rel='stylesheet', href='/stylesheets/style.css')
//material-design-lite
link(rel='stylesheet', href='/bower_components/material-design-lite/material.min.css')
script(src='/bower_components/material-design-lite/material.min.js')
link(rel='stylesheet', href='https://fonts.googleapis.com/icon?family=Material+Icons')
//jQuery
script(src='/bower_components/jquery/dist/jquery.min.js')
//Material icon fonts
//link(rel="stylesheet", href="https://fonts.googleapis.com/icon?family=Material+Icons")
link(href='https://fonts.googleapis.com/css?family=Open+Sans', rel='stylesheet', type='text/css')
//polyfill (support for dialog)
script(src="/bower_components/dialog-polyfill/dialog-polyfill.js")
link(rel="stylesheet", type="text/css", href="/bower_components/dialog-polyfill/dialog-polyfill.css")
根据您的错误消息,我同意 @e666 正在关闭的问题行。其他一些要检查的事情是您相对于其他脚本加载 MDL 的位置。 Script loading can get a bit tricky sometimes.
除此之外,如果您要在服务器上动态构建 HTML 页面,您还可以考虑直接在 DOM 中设置滑块的值。
例如,滑块的 HTML 看起来像这样:
<p style="width:300px">
<input class="mdl-slider mdl-js-slider" type="range" id="s1" min="0" max="10" value="4" step="2">
</p>
注意 value
选项。如果这对您来说是一种可能的选择,您可以使用服务器端代码动态设置该值。
如果您使用的是 ASP.NET,您可能会这样做。
@model MyModel
<div>
<p style="width:300px">
<input class="mdl-slider mdl-js-slider" type="range" id="s1" min="0" max="10" value="@Model.InitialValue" step="2">
</p>
</div>
但是,如果您在 JavaScript 加载时遇到问题,我建议您在继续之前确保所有内容都正确加载,因为它可能会在以后影响您。
您的滑块和 javascript 代码的顺序是什么? 如果您先调用您的函数然后创建滑块,该函数将找不到它。这可能是它未定义的原因。 这也是它在等待一秒钟后起作用的原因。在这一秒内,页面已完全加载,可以找到滑块。
如果先创建滑块然后再更改它,则可以对其进行操作。 您可以使用滑块后的代码块执行此操作,其中调用了更改滑块值的函数。
我花了几个月的时间,但终于找到了解决办法。只需要添加这个 --
$( document ).ready(function() {
componentHandler.upgradeAllRegistered();
// --- do stuff on mdl elements here ---
});
这有一个额外的好处,即在完全加载之前隐藏丑陋的 mdl 组件版本。