【问题标题】:Scala JS: Call a Javascript function on an elementScala JS:在元素上调用 Javascript 函数
【发布时间】:2015-10-08 00:36:44
【问题描述】:

我有以下问题。我想在我的项目中使用https://github.com/aehlke/tag-it/。但是我不确定我应该如何实现github页面上给出的以下示例:

<script type="text/javascript">
$(document).ready(function() {
 $("#myTags").tagit();
});
</script>

<ul id="myTags">
 <!-- Existing list items will be pre-added to the tags -->
 <li>Tag1</li>
 <li>Tag2</li>
</ul>

到目前为止,我能够操作对象:

val document = js.Dynamic.global.document
document.getElementById("myTags").innerHTML = "Test"

这行得通! Test 正在渲染中。

当我打电话给tagit() 时,我被告知tagit is not a function

val document = js.Dynamic.global.document
document.getElementById("myTags").tagit()

当我使用 chrome java 脚本控制台进行“相同”调用时,一切正常:

$("#myTags").tagit();

有人可以解释我做错了什么吗?提前谢谢!

编辑

这不是 tag-it 或 jquery 未加载的问题。 chrome 控制台再次工作。这也不是加载问题。即使在所有内容都加载为 100% 后单击一个按钮,它也不起作用。

编辑

添加了我的部分构建定义,这样每个人都可以看到依赖项是正确的:

.jsSettings(
      jsDependencies ++= Seq(
        "org.webjars" % "bootswatch-yeti" % "3.3.5" / "js/bootstrap.js" minified "js/bootstrap.min.js" dependsOn "jquery.js",
        "org.webjars" % "jquery-ui" % "1.11.4" / "jquery-ui.js" minified "jquery-ui.min.js" dependsOn "jquery.js",
        "org.webjars" % "tag-it" % "2.0" / "js/tag-it.js" dependsOn "jquery.js" dependsOn "jquery-ui.js"
      ),
      libraryDependencies ++= Seq(
        "io.github.widok" %%% "widok" % "0.2.2" exclude ("org.webjars", "bootstrap"),
        "be.doeraene" %%% "scalajs-jquery" % "0.8.0",
        "com.lihaoyi" %%% "scalatags" % "0.4.6",
        "org.webjars" % "bootswatch-yeti" % "3.3.5",
        "org.webjars" % "font-awesome" % "4.4.0",
        "org.webjars" % "jquery-ui-themes" % "1.11.4"
      ),
      persistLauncher := true
    )

【问题讨论】:

  • 两个问题,一)你可能没有在你的网站上添加 tag-it js 二)tag-it 在 jquery 之前添加。
  • @Omidam81 都不是这样。我什至安装了一个按钮来测试以确保所有内容都已加载。它不起作用。 Chrome 控制台有效,按钮无效。
  • 请检查答案。谢谢,
  • 您的代码是正确的,但我认为问题在于您添加脚本(带有 src)标签的顺序。
  • @Omidam81 不,scala js 不会发生这种情况。我更新了我的问题。如您所见,我已经告诉编译器 tag-it 依赖于 jquery 和 jquery-ui。一旦完成,一切都会为您处理。那里不可能有错误。

标签: javascript scala scala.js


【解决方案1】:

你的问题最初是这样的

// Scala.js code
document.getElementById("myTags").tagit()

“相同”
// JavaScript code
$("#myTags").tagit();

相反,它是一样的,你猜怎么着?

// JavaScript code
document.getElementById("myTags").tagit();

这是无效的,因为tagit() 不是getElementById 返回的HTMLElement 的方法。 tagit() 是由$ 函数返回的JQuery 对象的(拉皮条)方法。

您可以使用动态类型的方式获取$ 函数:

// Scala.js code
val $ = js.Dynamic.global.$

然后您可以编写 与 jQuery 调用相同的,如下所示:

// Scala.js code
$("#myTags").tagit()

找到的解决方案本质上是相似的,因为jQuery 对象等同于$。但是返回的元素是一个JQuery 对象,静态没有tagit() 方法,这就是为什么你需要将它转换为js.Dynamic

另一种方法是使用以下方法键入tagit() 方法 pimp:

// Scala.js code
@js.native
trait JQueryTagIt extends js.Object {
  def tagit(): Unit = js.native
}

implicit def tagItExtensions(jq: JQuery): JQueryTagIt =
  jq.asInstanceOf[JQueryTagIt]

有了它,你可以更简单地做:

// Scala.js code
jQuery("#myTags").tagit()

它会被静态类型检查。

【讨论】:

  • 非常感谢!很好的解释。我仍然不明白的一件事是我应该如何传递选项。例如tagit({tagLimit: 1}).
  • 对于动态类型版本,使用js.Dynamic.literal(tagLimit = 1)。对于静态类型的版本,请参阅这个问题:stackoverflow.com/questions/26638171/…
【解决方案2】:

$(document).ready(function(){
  $("#myTags").tagit();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>
<script src="http://bitar.tk/tag-it.min.js"></script>

<ul id="myTags">
 <!-- Existing list items will be pre-added to the tags -->
 <li>Tag1</li>
 <li>Tag2</li>
</ul>

【讨论】:

  • 非常感谢。你看到我在使用 Scala JS 了吗?我正在构建一个 SPA(单页应用程序)。一个使用 sbt 构建定义定义 scala 依赖项。我更新了我的遮阳篷,这样每个人都可以看到我的部门。
【解决方案3】:

我找到了一个可行的解决方案。它为 Scala JS 使用 jQuery 绑定。通过构建自己的静态绑定是我猜的正确方法。

jQuery("#myTags").asInstanceOf[js.Dynamic].tagit()

更新

请参阅以下帖子 (https://stackoverflow.com/a/32994303/1029251),因为考虑到 scala.js 的含义,这种方法完全是错误的。我的解决方案不是类型安全的!

【讨论】:

  • 这种方法总是有效的,但如果你能避免它,不建议这样做,因为它会让你脱离强类型的领域,而强类型是 Scala.js 的重点。所以这种事情通常被视为不得已而为之。
  • @JustinduCoeur 我同意 100%。我在 sjrd awnsered 之前发布了这个。我将编辑帖子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-18
  • 2022-01-23
  • 2015-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多