Dean Elgar took a stunning catch to dismiss Jos Buttler for 20, as South Africa reduced the tourists to 309-8 on day two of the final Test between the Proteas and England.