首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kotlin-JS互操作-使用语言构造

Kotlin-JS互操作-使用语言构造
EN

Stack Overflow用户
提问于 2015-06-20 05:54:11
回答 2查看 618关注 0票数 1

我有一个js互操作函数,它使用for in构造来迭代输入元素,但它在运行时抛出了错误。

代码语言:javascript
复制
native("document")
val ndoc: dynamic = noImpl

fun jsInterOp() {
    js("console.log('JS inling from kotlin')")

    val ies = ndoc.getElementsByTagName("input")
    for (e in ies) {
      console.log("Input element ID: ${e.id}")
    } 
}

获取以下js错误

代码语言:javascript
复制
Uncaught TypeError: r.iterator is not a functionKotlin.defineRootPackage.kotlin.Kotlin.definePackage.js.Kotlin.definePackage.iterator_s8jyvl$ @ kotlin.js:2538

对如何修复这个问题有什么建议吗?

Kotlin : M12

为该函数生成的js代码是,

代码语言:javascript
复制
    jsInterOp: function () {
      var tmp$0;
      console.log('JS inling from kotlin');
      var ies = document.getElementsByTagName('input');
      tmp$0 = Kotlin.modules['stdlib'].kotlin.js.iterator_s8jyvl$(ies);
      while (tmp$0.hasNext()) {
        var e = tmp$0.next();
        console.log('Input element ID: ' + e.id);
      }
    },
EN

回答 2

Stack Overflow用户

发布于 2015-06-21 16:55:44

forEach不起作用,因为它是JS中的Array函数,但getElementsByTagName返回HTMLCollection。因此,我更改了kotlin代码,以使用传统的for循环,该循环遍历此集合并按预期工作。

代码语言:javascript
复制
 val ies = ndoc.getElementsByTagName("input")
 for (i in 0..(ies.length as Int) - 1) {
    console.log("InputElement-${i} : ${ies[i].id}")
 }
票数 3
EN

Stack Overflow用户

发布于 2015-06-21 03:04:36

Kotlin for-loop使用了很多内部魔法,forEach()在JS上更简单。试试这个:

代码语言:javascript
复制
ies.iterator().forEach { ... }

这似乎是Kotlin M12中的一个错误,因为我甚至无法对简单的列表执行for循环。

代码语言:javascript
复制
for(i in listOf(1, 2));  // TranslationInternalException

也叫

我不确定您在这里使用document是什么,但您可能会喜欢标准的API:

代码语言:javascript
复制
import kotlin.browser.document
val ies = document.getElementsByTagName("input")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30947828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档