Во втором случае не срабатывает, потому что вы не дожидаетесь окончания построения DOM модели документа, следовательно у вас там даже $("#search_box") будет равен []. Вариантов выполнения после загрузки много.
1. Обычная jquery анонимка, срабатывающая после загрузки DOM
$(function(){
$("#search_box").keyup(function(I){ ... });
})
2. Явно привязаться на событие DOMContentLoaded
$(document).on("DOMContentLoaded", function(){
// Дождались загрузки DOM, можем производить манипуляции с html элементами.
})