【发布时间】:2013-01-18 23:23:36
【问题描述】:
为了学习练习,我将一个 sinatra/backbone 应用程序转换为 Rails 环境。我让它在 Chrome 和 Firefox 上运行,但它在 Safari 上不起作用。原来的应用程序http://backbone-hangman.heroku.com 也不能在 Safari 上运行。当您单击“新游戏”时,它似乎不会触发事件。 Safari 控制台没有显示任何错误(尽管我对 Safari 的开发人员工具并不熟悉,因为我从不使用它们)。
由于这里有应用程序的实时版本http://backbone-hangman.heroku.com 我不会发布很多代码,但这是设置点击事件的视图代码#new_game,触发 startNewGame 功能。 Safari 中什么也没有发生。原文的源代码在这里https://github.com/trivektor/Backbone-Hangman
我在 Google 上搜索了一下,发现有人提到 Safari 以不同的方式处理事件,但找不到解决方案。有什么可以推荐的吗?
$(function() {
window.OptionsView = Backbone.View.extend({
el: $("#options"),
initialize: function() {
this.model.bind("gameStartedEvent", this.removeGetAnswerButton, this);
this.model.bind("guessCheckedEvent", this.showGetAnswerButton, this);
},
events: {
'click #new_game': 'startNewGame',
'click #show_answer': 'showAnswer'
},
startNewGame: function() {
this.model.new();
},
removeGetAnswerButton: function() {
$("#show_answer").remove();
},
showGetAnswerButton: function(response) {
console.log("showGetAnswerButton");
console.log(response);
var threshold = this.model.get("threshold");
console.log(threshold);
if (response.incorrect_guesses == this.model.get("threshold")) {
$(this.el).append('<input type="button" id="show_answer" class="action_button" value="Show answer" />');
}
},
showAnswer: function() {
this.model.get_answer();
}
})
})
更新
基于 OP 下面的 cmets 之一,我发布了更多代码。这是hangman.js,其中对象被实例化
var game = new Game
var options_view = new OptionsView({model: game});
var characters_view = new CharactersView({model: game});
var hint_view = new HintView({model: game});
var word_view = new WordView({model: game});
var hangman_view = new HangmanView({model: game});
var answer_view = new AnswerView({model: game});
var stage_view = new StageView({model: game});
视图和模型像这样附加到窗口
window.AnswerView = Backbone.View.extend({ ...
更新 除了在站点范围内加载的 Backbone、jQuery 和 Underscore 之外,还为 Rails 系统中的这个特定应用程序加载了以下文件。
【问题讨论】:
-
这个问题对我来说似乎很奇怪:Backbone 只使用 jQuery(或 Zepto,如果你喜欢这种东西)来做它的事件连接,而 jQuery 以为你处理浏览器问题而闻名.并不是说我说你是骗子或任何东西;-) 只是说,这个问题很奇怪。
-
嗯,你可以自己查看演示应用中的代码。它在 Safari 中对你有用吗?
-
页面加载中是否存在选项?可能是文件准备时间的东西
-
呃,你忘记新建对象了吗?新的 Window.OptionsView()?也可能是您将它直接附加到窗口,我不会那样做,只是让全局成为任何东西。不确定 Safari 在页面加载之前如何管理全局窗口。
-
@amchang87 根据我对您评论的理解,我用更多代码更新了 OP。但是,由于我没有那么有经验,因此我不确定可能需要进行哪些更改...您是否介意写一个答案来说明我如何更改代码,这样我就不会“直接将其附加到窗口” “?如果这确实是我正在做的......谢谢
标签: backbone.js