<div class="row" v-for="(book, index) in Subsequent" :key="index">
<div class="col-md-8">
<div class="form-group label-floating">
<label class="control-label"> Details</label>
<input type="text" class="form-control" v-model="book.seizuredetails" id="transliterateTextarea2">
</div>
</div>
</div>
<a @click="addNewRow">Add Another</a>
</div>
我在第一个输入框中得到音译。 (在第一种情况下没有问题)
因此,当我单击“添加另一个”时,我可以有一个新的输入框。但是在这种情况下音译是行不通的。
我的音译脚本是
<script type="text/javascript">
// Load the Google Transliterate API
google.load("elements", "1", {
packages: "transliteration"
});
function onLoad() {
var options = {
sourceLanguage: google.elements.transliteration.LanguageCode.ENGLISH,
destinationLanguage: [google.elements.transliteration.LanguageCode.MALAYALAM],
shortcutKey: 'ctrl+g',
transliterationEnabled: true
};
// Create an instance on TransliterationControl with the required
// options.
var control = new google.elements.transliteration.TransliterationControl(options);
// Enable transliteration in the textbox with id
// 'transliterateTextarea'.
var ids = [ "transliterateTextarea", "transliterateTextarea1", "transliterateTextarea2" ];
control.makeTransliteratable(ids);
}
google.setOnLoadCallback(onLoad);
</script>
因此,当单击“添加另一个”时,如何为该输入区域赋予新的音译ID。
请帮我解决。
最佳答案
基本上,您将获得makeTransliteratable
代码并将其放置在方法中。在那之后,您将在要使其可转译的任何输入上调用此类方法。
不过,有些陷阱。
第一个是如何判断Google音译是否已加载。我在方法中使用Promise(window.googleIsloaded
)和await window.googleIsLoaded;
来确保它仅在Google加载后才执行。
第二个陷阱更糟:在音译时,google直接设置<input>
的值,并且在执行时不会发出任何事件。由于没有事件,因此Vue无法更新v-model
属性。为了克服这个问题,我创建了一个Proxy
来拦截对输入的任何调用,并在google直接设置该值时发出输入事件,从而允许Vue进行更改。缺点是Proxy API在中不可用。
JSFiddle demo here.
更新:
好了,我想出了一种解决方法,可以在所有IE版本的Vue支持中使用,也可以将其转换为 Vue custom directive 。
因此,您要做的就是将v-transliterate="options"
添加到<input>
或<textarea>
中,成为options
您的对象或属性,其中包含该特定<input>
/<textarea>
音译的配置。例子:
<input type="text" v-model="somevar" v-transliterate="options">
Demo JSFiddle here.代码:
<script src="https://unpkg.com/vue"></script>
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script>
// Load the Google Transliterate API
google.load("elements", "1", {
packages: "transliteration"
});
Vue.directive('transliterate', function (el, binding) {
var control = new google.elements.transliteration.TransliterationControl(binding.value);
// a getter for each property google transliterate reads and a setter for each it modifies
var inputOrTextareaProxy = {
get getAttribute() { return el.getAttribute.bind(el); },
get addEventListener() { return el.addEventListener.bind(el); },
get blur() { return el.blur.bind(el); },
get focus() { return el.focus.bind(el); },
get tagName() { return el.tagName; },
get type() { return el.type; },
get id() { return el.id; },
get style() { return el.style; },
get selectionStart() { return el.selectionStart; },
get selectionEnd() { return el.selectionEnd; },
get value() { return el.value; },
set value(v) { el.value = v; el.dispatchEvent(new CustomEvent('input')); },
get nodeType() { return el.nodeType; },
get ownerDocument() { return el.ownerDocument; },
get scrollTop() { return el.scrollTop; },
set scrollTop(v) { el.scrollTop = v; }
};
control.makeTransliteratable([inputOrTextareaProxy]);
});
</script>
<div id="app">
<div class="row" v-for="(book, index) in Subsequent" :key="index">
<div class="col-md-8">
<div class="form-group label-floating">
<label class="control-label"> Details</label>
<input type="text" class="form-control" v-model="book.seizuredetails" v-transliterate="options"> (Type "World." with the dot!) {{ book.seizuredetails }}
</div>
</div>
</div>
<a @click="addNewRow">Add Another</a>
</div>
new Vue({
el: '#app',
data: {
message: 'Hello Vue.js!',
Subsequent: [
{seizuredetails: ''}
],
options: {
sourceLanguage: google.elements.transliteration.LanguageCode.ENGLISH,
destinationLanguage: [google.elements.transliteration.LanguageCode.MALAYALAM],
shortcutKey: 'ctrl+g',
transliterationEnabled: true
}
},
methods: {
addNewRow: function() {
this.Subsequent.push({seizuredetails: ''})
}
}
})
关于javascript - 选择第二个输入框时,为什么音译不起作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49892373/